Laravel 4 A începe la un API RESTful (actualizat)

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.


Aplicația

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ă?

Instalați Laravel 4

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'),

Bază de date

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:

  1. Utilizatori, inclusiv un nume de utilizator și o parolă
  2. URL-uri, inclusiv o adresă URL și o descriere

Vom folosi migrațiile lui Laravel pentru a crea și popula baza de date.

Configurați 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' =>,

Creați fișiere de migrare

$ 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.

Adăugați exemple de utilizatori

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'); 

Rulați migrațiile

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

modele

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ă noi auth.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 nevalide

După 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-8 

Salut Lume!

A mers!

În acest moment, activitatea de bază a API-ului nostru se face. Noi avem:

  • Instalat Laravel 4
  • Crearea bazei noastre de date
  • Creat modelele noastre
  • Creat un model de autentificare

Crearea cererilor funcționale

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.

Creați un controler util

$ 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.

  1. Aceasta va răspunde la cererile adresate http://example.com/api/v1/url.
  2. Acest lucru ne permite să adăugăm rute suplimentare, dacă trebuie să extindem API-ul nostru. De exemplu, dacă adăugați un punct de sfârșit de utilizator, cum ar fi / Api / v1 / utilizator.
  3. Există, de asemenea, un mecanism de denumire pentru versiunea API. Acest lucru ne oferă posibilitatea de a lansa noi versiuni API fără a rupe versiunile mai vechi - Putem crea un simplu v2 grup de rute și îndreptați-l spre un nou controler!

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.

Adăugați funcționalitatea

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.

Creați o adresă URL

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 " "]

Si asta e

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:

  1. Instalați Laravel
  2. Creați baza de date utilizând migrații și semănări
  3. Utilizați modele ORM elocvente
  4. Autentificați-vă cu Auth
  5. Configurați rute, inclusiv versiunea API
  6. Creați funcționalitatea API utilizând controlori de resurse

Următorii pași

Dacă doriți să împingeți API-ul într-o notă, ați putea considera oricare din următoarele ca un pas înainte.

  1. Validare (Indicație: Laravel are o bibliotecă de validare).
  2. API-cererea de eroare de manipulare - Este încă posibil să primiți răspuns HTML pe cererile API (Sugestie: Laravel Eroare de manipulare, plus negociere de conținut.)
  3. Negocierea conținutului - ascultarea pentru antetul Accept. (Sugestie: Clasa de Solicitare Laravel vă va da antetele de cerere).
  4. Consultați Grupul Google API Craft.
  5. Aflați mai multe despre cache-urile de tip diferite și despre modul în care Caching-ul de validare vă poate îmbunătăți API-ul.
  6. Unitatea vă testează codul.
  7. Verificați resursele mari ale API ale Apigee.
  8. Încercați câteva dintre scripturile și pluginurile Laravel utile disponibile pe Envato Market.