RESTful API sunt greu! Există multe aspecte legate de proiectarea și scrierea unui model de succes. De exemplu, unele dintre subiectele pe care le considerați a fi manipulate includ autentificarea, hypermedia / HATEOS, versiunea, limitele ratelor și negocierea conținutului. În loc să abordăm toate aceste concepte, trebuie să ne concentrăm în schimb pe elementele de bază ale REST. Vom face câteva puncte finale JSON în spatele unui sistem de autentificare de bază și vom afla câteva trăsături Laravel 4 în proces.
Dacă aveți nevoie de ajutor pentru dezvoltarea Laravel, încercați câteva dintre scripturile și pluginurile Laravel utile disponibile pe Envato Market.
Să construim un API pentru o aplicație simplă Read-It-Later. Utilizatorii vor putea crea, citi, actualiza și șterge URL-urile pe care doresc să le citească mai târziu.
Gata să se scufunde și să înceapă?
Creați o nouă instalare a lui Laravel 4. Dacă sunteți la îndemână cu CLI, încercați acest ghid rapid. În caz contrar, avem un tutorial video aici pe Nettuts + care acoperă procesul.
Vom crea mai întâi o cheie de criptare pentru hash de parole securizate. Puteți face acest lucru cu ușurință, executând această comandă din root-ul proiectului:
$ key artisan php: generați
Alternativ, puteți să vă editați simplu app / config / app.php
cheia de criptare:
/ * | ----------------------------------------------- --------------------------- Tasta de criptare | ----------------------------------------------- --------------------------- | Această tastă este utilizată de serviciul de criptare Illuminate și trebuie setată | la un șir aleator, lung, altfel aceste valori criptate nu vor | fi sigur. Asigurați-vă că modificați-l înainte de a implementa orice aplicație! | * / 'key' => md5 ('aceasta este o modalitate de a obține un set de chei de criptare'),
Odată ce aveți o instalare de lucru a Laravel 4, putem începe cu distracția. Vom începe prin crearea bazei de date a aplicației.
Acest lucru va necesita doar două tabele de baze de date:
Vom folosi migrațiile lui Laravel pentru a crea și popula baza de date.
Editați | × app / config / database.php
și completați-o cu setările bazei dvs. de date. Notă: aceasta înseamnă crearea unei baze de date pentru utilizarea acestei aplicații. Acest articol presupune o bază de date MySQL.
'connect' => array ('mysql' => array ('driver' => 'mysql', 'host' => 'localhost', 'database' => 'read_it_later', 'username' => 'your_username' 'password' => 'your_password', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' =>,
$ php artisan migra: face create_users_table --table = utilizatori --create $ php artizan migrate: make create_urls_table --table = urls --create
Aceste comenzi au creat scripturile de migrare de bază pe care le vom folosi pentru a crea tabelele bazei de date. Treaba noastră acum este să le umplem cu coloanele de tabelă corecte.
Editați | × app / baze de date / migrări / SOME_DATE_create_users_table.php
și adăugați la sus()
metodă:
funcția publică () Schema :: create ('utilizator', funcție (tabelul Blueprint $) $ table-> increments ('id'); tabelul-> șir ("parola"); $ table-> timestamps (););
Deasupra, setăm un nume de utilizator (care ar trebui să fie unic), o parolă, precum și marcajele de timp. Salvați acest lucru și editați acum app / baze de date / migrări / SOME_DATE_create_urls_table.php
, și adăugați la sus()
metodă:
functie publica sus () Schema :: create ('urls', function (tabela Blueprint $) $ table-> increments ('id'); $ table-> integer ('user_id' 'url'); $ table-> șir ("descriere"); $ table-> timestamps (););
Singura notă importantă din acest fragment este că creăm o legătură între URL-ul
și utilizatori
tabel, prin numele de utilizator
camp.
Putem folosi semințele lui Laravel pentru a crea câțiva utilizatori de eșantion.
Creați un fișier în cadrul app / baze de date / semințe
dosar care are același nume ca și tabelul căruia îi corespunde; în cazul nostru, UserTableSeeder.php
. Adăuga:
șterge(); Utilizator :: crea (array ('username' => 'firstuser', 'password' => Hash :: make ('first_password'))); Utilizator :: crea (array ('username' => 'seconduser', 'password' => Hash :: make ('second_password'));
Apoi, asigurați-vă că clasa de semințe se execută atunci când baza de date este însămânțată. Editați | × app / baze de date / semințe / DatabaseSeeder.php
:
funcția publică funcțională () Eloquent :: unguard (); // Adăugați sau dezactivați această linie $ this-> call ('UserTableSeeder');
Iată cum să creați cele două tabele și să inserați utilizatorii de eșantion.
// Creați cele două tabele $ php artisan migrate // Creați eșantionul utilizatorilor $ php artisan db: seed
Laravel 4 continuă să folosească ORM excelent elocvent. Acest lucru va face ca procesul de gestionare a apelurilor la baze de date să fie rapid. Vom cere un model pe tabel.
Din fericire, Laravel vine cu o configurare a modelului de utilizator, deci să creăm un model pentru tabelul nostru de url-uri.
Creați și editați fișierul app / modele / Url.php
.
Autentificare
Filtrele lui Laravel se pot ocupa de autentificare pentru noi. În special, Laravel vine acum cu un filtru de autentificare de bază, pe care îl putem folosi ca model de autentificare rapidă pentru a fi utilizat cu cererile noastre API.
Dacă vă deschideți
app / filters.php
, veți vedea cum arată:Route :: filtru ('auth.basic', function () retur Auth :: basic (););Trebuie doar să facem o ajustare. Implicit, acest filtru caută un câmp de e-mail pentru a identifica utilizatorul. Deoarece utilizăm numele de utilizator în loc de e-mailuri, trebuie doar să ajustăm această preferință. Schimba
Auth :: bază ()
sunați prin oferirea câmpului nostru de nume de utilizator ca parametru:Route :: filtru ('auth.basic', function () retur Auth :: basic ("username"););Rutele
Să testați asta. Creați un traseu, numit
testauth
, și asigurați-vă că noiauth.basic
filtrul funcționează înainte de el.Editați | ×
app / routes.php
:Route :: get ('/ authtest', array ('înainte' => 'auth.basic', funcție () retur View :: make ('hello');));Putem testa acest lucru cu o cerere de curl. Din terminalul dvs., încercați să vă îndreptați spre construirea lui Laravel. În al meu, se pare că acest lucru (adresa dvs. URL va fi probabil diferită!):
$ curl -i localhost / l4api / public / index.php / authtest HTTP / 1.1 401 Data neautorizată: Tue, 21 May 2013 18:47:59 GMT WWW-Authenticate: Vary de bază: Accept-Encoding Content Type: text / html ; charset = UTF-8 Acreditări nevalideDupă cum puteți vedea, se detectează o cerere neautorizată și se întoarce un mesaj "Certificatele nevalide" cu un cod de stare 401. În continuare, încercați să includeți autentificarea de bază.
$ curl -user primauser: first_password localhost / l4api / public / index.php / authtest HTTP / 1.1 200 OK Data: Tue, 21 May 2013 18:50:51 GMT Vary: Accept-Encoding Content Type: text / html; charset = UTF-8Salut Lume!
A mers!
În acest moment, activitatea de bază a API-ului nostru se face. Noi avem:
S-ar putea să fiți familiarizați cu controlorii RESTful Laravel. Ei încă mai există în Laravel 4; cu toate acestea, putem folosi și Controlerele Resursabile Laravel, care au creat câteva paradigme pe care le putem folosi pentru a face o interfață API consistentă. Vom folosi un controler Resourceful.
Iată o defalcare a ceea ce vor gestiona fiecare metodă din controlerul de resurse. Rețineți că puteți să eliminați ruta / resource / create / / resource / id / editarea, deoarece nu vom fi nevoiți să afișați formularele "create" sau "editați" într-un API.
$ php artizan controller: face UrlController
Apoi, configurați o rută pentru a utiliza controlerul și solicitați ca fiecare rută să fie autentificată.
Editați | × app / routes.php
si adauga:
// Grupul de rutare pentru versiunea API Route :: grup (array ('prefix' => 'api / v1', 'înainte' => 'auth.basic' "UrlController"););
Câteva lucruri se întâmplă acolo.
http://example.com/api/v1/url
./ Api / v1 / utilizator
.Notă: vă recomandăm să luați în considerare mai multe tehnici avansate de versiune API, cum ar fi utilizarea unui Accept
antet sau subdomeniu, care vă pot ajuta să indicați diferite versiuni de coduri API diferite.
Editați noul app / controlere / UrlController.php
fişier:
// Editați această funcție: index public function () return 'Hello, API';
Să încercăm:
$ curl -i localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 401 Data neautorizată: Tue, 21 May 2013 19:02:59 GMT WWW-Authenticate: Basic Vary: Accept-Encoding Content-Type : text / html; charset = UTF-8 Acreditări nevalide. $ curl -user primauser: first_password localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 200 OK Data: Tue, 21 May 2013 19:04:19 GMT Vary: Accept- text / html; charset = UTF-8 Bună ziua, API
Avem acum un controler plin de resurse cu autentificare și sunt gata să adăugăm funcționalități.
Editați | × app / controlere / UrlController.php
:
/ ** * Stocați o resursă nou creată în spațiu de stocare. * * @backurn Response * / public function store () $ url = url nou; $ url-> url = Solicitare :: obține ('url'); $ url-> description = Cerere :: get ('description'); $ url-> user_id = Auth :: utilizator () -> id; // Validarea și filtrarea sunt extrem de necesare !! // Serios, sunt o persoană proastă că am lăsat asta. $ Url-> Salvare (); retur Răspuns: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200);
Este timpul să încercați acest lucru cu o altă cerere de curl. Acesta va trimite o cerere POST, care va corespunde cu magazin()
metoda creată mai sus.
$ curl -i -user primauser: first_password -d 'url = http: //google.com&description=A Motorul de căutare' localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 201 Data creării: , 21 Mai 2013 19:10:52 GMT Tip de conținut: cerere / json "error": false, "message": "URL created"
Rece! Să mai creăm câteva, atât pentru utilizatorii noștri.
$ curl -user primauser: first_password -d 'url = http: //fideloper.com&description=A Blog Mare' localhost / l4api / public / index.php / api / v1 / url $ curl -user seconduser: second_password -d 'url = http: //digitalsurgeons.com&description=A Agenția de marketing' localhost / l4api / public / index.php / api / v1 / url $ curl - utilizatorul seconduser: second_password -d 'url = http: //www.poppstrong .com / & description = Mă simt pentru el 'localhost / l4api / public / index.php / api / v1 / url
Apoi, să creați metode pentru preluarea adreselor URL.
/ ** * Afișați o listă a resurselor. * * @backurn Response * / index public function () // Fost: revenire 'Hello, API'; $ urls = Url :: unde ('user_id', Auth :: user () -> id) -> get (); retur Răspuns: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200); / ** * Afișați resursa specificată. ($ id) // Asigurați-vă că utilizatorul curent deține resursa solicitată $ url = Url :: where ('user_id', Auth :: user () -) > id) -> unde ('id', $ id) -> ia (1) -> get (); retur Răspuns: json (array ('error' => false, 'urls' => $ url-> toArray ()), 200);
Să le testați:
$ curl -user primauser: first_password localhost / l4api / public / index.php / api / v1 / url "error": false, "urls": ["created_at": "2013-02-01 02:39: 10 "," descriere ":" Un motor de căutare "," id ":" 2 "," updated_at ":" 2013-02-01 02:39:10 "," url ":" http://google.com "," user_id ":" 1 ", " created_at ":" 2013-02-01 02:44:34 "," descriere " : "2013-02-01 02:44:34", "url": "http://fideloper.com", "user_id": "1"] $ curl -user primauser: first_password localhost / l4api / public / index.php / api / v1 / url / 1 "eroare": false, "urls": "" created_at ":" 2013-02-01 02:39:10 " Engine "," id ":" 2 "," updated_at ":" 2013-02-01 02:39:10 "," url ":" http://google.com "," user_id ":" 1 " ]
Aproape gata. Să permitem acum utilizatorilor să ștergă o adresă URL.
/ ** * Eliminați resursele specificate din spațiul de stocare. * * @param int $ id * @return Response * / funcția publică distruge ($ id) $ url = Url :: unde ('user_id', Auth :: user () -> id) ; $ Url-> șterge (); retur Răspuns: json (array ('error' => false, 'message' => 'url deleted'), 200);
Acum, putem șterge o adresă URL utilizând o solicitare DELETE:
$ curl -i -X DELETE - primul utilizator: prima_password localhost / l4api / public / index.php / api / v1 / url / 1 HTTP / 1.1 200 OK Data: Tue, 21 May 2013 19:24:19 GMT Content- Tip: aplicație / json "error": false, "message": "url deleted"
În cele din urmă, permiteți utilizatorilor să actualizeze o adresă URL.
/ ** * Actualizați resursele specificate în memorie. * * @param int $ id * @return Response * / actualizare functie publica ($ id) $ url = Url :: unde ('user_id', Auth :: user () -> id) ; dacă (Request :: get ('url')) $ url-> url = Request :: get ('url'); dacă (Cerere :: get ('description')) $ url-> description = Cerere :: get ('description'); $ url-> salvați (); retur Răspuns: json (array ('error' => false, 'message' => 'url updated'), 200);
Pentru a testa actualizările adreselor URL, executați:
$ curl -i -X PUT -user seconduser: second_password -d 'url = http: //yahoo.com localhost / l4api / public / index.php / api / v1 / url / 4 HTTP / 1.1 200 OK Data: Tue, 21 May 2013 19:34:21 GMT Content-Type: aplicație / json "error": false, "message": "url updated" // Vizualizați modificările noastre $ curl --user seconduser: second_password localhost / l4api /public/index.php/api/v1/url/4 "error": false, "urls": ["created_at": "2013-02-01 02:44:34", "descriere": " simt pentru el "," id ":" 3 "," updated_at ":" 2013-02-02 18:44:18 "," url ":" http://yahoo.com "," user_id " "]
Avem acum începutul unui API pe deplin funcțional. Sper că ați învățat multe despre cum să obțineți un API în curs de desfășurare cu Laravel 4.
Pentru a recapitula, am realizat următoarele în această lecție:
Dacă doriți să împingeți API-ul într-o notă, ați putea considera oricare din următoarele ca un pas înainte.