Laravel 4 En start på en RESTful API (oppdatert)

RESTful API er vanskelig! Det er mange aspekter å designe og skrive en vellykket. For eksempel kan noen av emnene du finner deg selv håndtere inkludere autentisering, hypermedia / HATEOS, versjonering, hastighetsbegrensninger og innholdsforhandling. I stedet for å takle alle disse konseptene, la oss imidlertid fokusere på grunnleggende REST. Vi lager noen JSON-endepoeng bak et grunnleggende autentiseringssystem, og lærer noen Laravel 4-triks i prosessen.

Hvis du trenger hjelp med Laravel-utviklingen, kan du prøve noen av de nyttige Laravel-skriptene og pluginene som er tilgjengelige på Envato Market.


App

La oss bygge en API for en enkel Read-It-Later-app. Brukere vil kunne lage, lese, oppdatere og slette nettadresser som de ønsker å lese senere.
Klar til å dykke inn og komme i gang?

Installer Laravel 4

Lag en ny installasjon av Laravel 4. Hvis du er nyttig med CLI, kan du prøve denne hurtigstartsveiledningen. Ellers har vi en videoopplæring her på Nettuts + som dekker prosessen.

Vi skal først lage en krypteringsnøkkel for sikker passord hashing. Du kan gjøre dette enkelt ved å kjøre denne kommandoen fra prosjektroten din:

$ php artisan nøkkel: generere

Alternativt kan du enkelt redigere din app / config / app.php krypteringsnøkkel:

/ * | ----------------------------------------------- --------------------------- | Krypteringsnøkkel | ----------------------------------------------- --------------------------- | | Denne nøkkelen brukes av Illuminate encrypter-tjenesten og skal settes | til en tilfeldig, lang streng, ellers vil disse krypterte verdiene ikke | vær trygg. Pass på at du endrer det før du bruker et program! | * / 'key' => md5 ('dette er en måte å få en krypteringsnøkkel sett inn'),

database

Når du har en fungerende installasjon av Laravel 4, kan vi komme i gang med det morsomme. Vi begynner med å lage appens database.

Dette vil bare kreve to databasetabeller:

  1. brukere, inkludert brukernavn og passord
  2. webadresser, inkludert en URL og beskrivelse

Vi bruker Laravel's migrasjoner for å lage og fylle databasen.

Konfigurer databasen din

Redigere app / config / database.php og fyll den med databasens innstillinger. Merk: dette betyr å opprette en database for dette programmet å bruke. Denne artikkelen antar en MySQL-database.

'connections' => array ('mysql' => array ('driver' => 'mysql', 'vert' => 'localhost', 'database' => 'read_it_later', 'brukernavn' => 'ditt_brukernavn' 'passord' => 'ditt_passord', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => ",),

Opprett overføringsfiler

$ php artisan migrere: lag create_users_table --table = users - opprett $ php artisan migrere: lag create_urls_table --table = urls --create

Disse kommandoene konfigurerer de grunnleggende migreringsskriptene som vi skal bruke for å opprette databasetabellene. Vår jobb nå er å fylle dem med de riktige tabellkolonnene.

Redigere app / database / vandringer / SOME_DATE_create_users_table.php og legg til i opp() metode:

(funksjon) opp tabell-> streng ('passord'); $ tabell-> tidsstempel ();); 

Over, vi setter inn et brukernavn (som skal være unikt), et passord, samt tidsstemplene. Lagre det, og rediger nå app / database / vandringer / SOME_DATE_create_urls_table.php, og legg til i opp() metode:

offentlig funksjon opp () Schema :: opprett ('urls', funksjon (Blueprint $ tabell) $ tabell-> trinn ('id'); $ tabell-> heltall ('user_id'); $ table-> string 'url'); $ tabell-> streng ('beskrivelse'); $ tabell-> tidsstempel ();); 

Det eneste viktige notatet i denne utdrag er at vi lager en kobling mellom url og brukere bord, via bruker-ID felt.

Legg til prøveeksemplarer

Vi kan bruke Laravel's frø for å lage noen få prøvebrukere.

Lag en fil i app / database / frø mappe som har samme navn som tabellen som den tilsvarer; i vårt tilfelle, UserTableSeeder.php. Legg til:

sletter (); Bruker :: create (array ('username' => 'firstuser', 'passord' => Hash :: make ('first_password'))); Bruker :: create (array ('username' => 'seconduser', 'passord' => Hash :: make ('second_password'))); 

Deretter sørg for at seeder-klassen kjører når databasen er podet. Redigere app / database / frø / DatabaseSeeder.php:

Public Function Run () Eloquent :: unguard (); // Legg til eller Uncomment denne linjen $ this-> call ('UserTableSeeder'); 

Kjør overføringene

Slik lager du de to tabellene, og setter inn våre sample-brukere.

// Opprett de to tabellene $ php artisan migrere // Lag sample brukerne $ php artisan db: frø

modeller

Laravel 4 fortsetter å bruke den utmerkede Eloquent ORM. Dette vil gjøre prosessen med å håndtere databasesamtaler et øyeblikk. Vi krever en modell per bord.

Heldigvis kommer Laravel med en brukermodelloppsett, så la oss lage en modell for vårt url-bord.

Opprett og rediger fil app / modeller / Url.php.

 

Godkjenning

Laravel s filter kan håndtere autentisering for oss. Spesielt kommer Laravel nå med et grunnleggende autentiseringsfilter, som vi kan bruke som en rask godkjenningsmodell som skal brukes sammen med API-forespørslene våre.

Hvis du åpner app / filters.php, Du ser hvordan det ser ut:

Rute :: filter ('auth.basic', funksjon () return Auth :: basic (););

Vi trenger bare å gjøre en justering. Som standard ser dette filteret etter et "email" -felt for å identifisere brukeren. Siden vi bruker brukernavn i stedet for e-post, trenger vi bare å justere den preferansen. Endre Auth :: enkel () ring ved å gi den brukernavnet vårt som parameter:

Rute :: filter ('auth.basic', funksjon () return Auth :: basic ("brukernavn"););

ruter

La oss teste dette ut. Opprett en rute, kalt testauth, og sørg for at vår auth.basic filteret kjører før det.

Redigere app / routes.php:

Rute :: få ('/ authtest', array ('før' => 'auth.basic', funksjon () return View :: make ('hallo');));

Vi kan teste dette med en krøllforespørsel. Fra din terminal, prøv å peke på Laravel-bygget ditt. I min ser det slik ut (Nettadressen din vil trolig være annerledes!):

$ curl -i localhost / l4api / public / index.php / authtest HTTP / 1.1 401 Uautorisert dato: tirsdag, 21 mai 2013 18:47:59 GMT WWW-Authenticate: Basic Vary: Accept-Encoding Content Type: tekst / html ; charset = UTF-8 Ugyldig legitimasjon

Som du kan se, oppdages en uautorisert forespørsel, og en melding om ugyldig legitimasjon returneres med en 401-statuskode. Deretter kan du prøve å inkludere grunnleggende godkjenning.

$ curl - user firstuser: first_password localhost / l4api / public / index.php / authtest HTTP / 1.1 200 OK Dato: Tir, 21 Mai 2013 18:50:51 GMT Varighet: Godta-Koding Innholdstype: Tekst / html; charset = UTF-8 

Hei Verden!

Det funket!

På dette tidspunktet er baselinearbeidet til API-en vår ferdigstilt. Vi har:

  • Installert Laravel 4
  • Opprettet vår database
  • Laget våre modeller
  • Opprettet en godkjenningsmodell

Opprette funksjonelle forespørsler

Du kan være kjent med Laravels RESTful-kontrollere. De eksisterer fortsatt i Laravel 4; Vi kan imidlertid også bruke Laravel's Resourceful Controllers, som setter opp noen paradigmer som vi kan bruke til å lage et konsistent API-grensesnitt. Vi bruker en Resourceful-kontroller.

Her er en oversikt over hva hver metode i den ressursrike kontrolleren skal håndtere. Vær oppmerksom på at du kan fjerne / ressurs / opprett og / ressurs / id / rediger ruter, siden vi ikke trenger å vise "opprette" eller "redigere" skjemaer i en API.

Lag en ressursfull kontrollør

$ php artisan controller: gjør UrlController

Deretter oppsett en rute for å bruke kontrolleren, og krever at hver rute skal godkjennes.

Redigere app / routes.php og legg til:

// Rutegruppe for API-versjon Rute :: gruppe (array ('prefix' => 'api / v1', 'før' => 'auth.basic'), funksjon () Rute :: ressurs ('url' 'UrlController'););

Noen ting skjer der.

  1. Dette kommer til å svare på forespørsler til http://example.com/api/v1/url.
  2. Dette tillater oss å legge til ekstra ruter, hvis vi må utvide vår API. For eksempel, hvis du legger til et brukerens sluttpunkt, for eksempel / Api / v1 / bruker.
  3. Det er også en navngivningsmekanisme på plass for versjonering av APIen vår. Dette gir oss muligheten til å rulle ut nye API-versjoner uten å bryte eldre versjoner. Vi kan bare lage en v2 rute gruppe, og pek den til en ny kontroller!

Merk: Du vil kanskje vurdere mer avanserte API-versjonsteknikker, for eksempel å bruke en Aksepterer header eller underdomene som kan hjelpe deg med å peke forskjellige API-versjoner separat kodebaser.

Legg til funksjonaliteten

Rediger det nye app / kontrollere / UrlController.php fil:

// Rediger dette: offentlige funksjonsindeks () return Hei, API '; 

La oss teste det:

$ curl -i localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 401 Uautorisert dato: tirsdag, 21 mai 2013 19:02:59 GMT WWW-Authenticate: Basic Vary: Accept-Encoding Content Type : tekst / html; charset = UTF-8 Ugyldig legitimasjon. $ curl - user firstuser: first_password localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 200 OK Dato: Tir, 21 Mai 2013 19:04:19 GMT Varighet: Godta-Koding Innholdstype: text / html; charset = UTF-8 Hei, API

Vi har nå en ressursfull kontroller med autentiseringsarbeid, og er klar til å legge til funksjonalitet.

Opprett en nettadresse

Redigere app / kontrollere / UrlController.php:

/ ** * Lagre en nyopprettet ressurs som er lagret. * * @return Response * / public function store () $ url = ny Url; $ url-> url = Request :: get ('url'); $ url-> description = Request :: get ('description'); $ url-> user_id = Auth :: bruker () -> id; // Validering og filtrering er svært nødvendig! // Seriøst er jeg en dårlig person for å forlate det ut. $ Url-> Lagre (); retur Svar :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200); 

Det er på tide å teste dette med en annen curl-forespørsel. Denne vil sende en POST-forespørsel, som vil svare til butikk() metode opprettet ovenfor.

$ curl -i - user firstuser: first_password -d 'url = http: //google.com&description=A søkemotor' localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 201 Opprettet dato: tue , 21 mai 2013 19:10:52 GMT Innholdstype: application / json "error": false, "message": "URL opprettet"

Kul! La oss lage noen flere, for begge våre brukere.

$ curl - user firstuser: first_password -d 'url = http: //fideloper.com&description=A Great Blog' localhost / l4api / public / index.php / api / v1 / url $ krøll - bruker sekunduser: second_password -d 'url = http: //digitalsurgeons.com&description=A Markedsføringsbyrå' localhost / l4api / public / index.php / api / v1 / url $ curl - bruker sekunduser: second_password -d 'url = http: //www.poppstrong .com / & description = Jeg føler for ham 'localhost / l4api / public / index.php / api / v1 / url

Deretter la vi lage metoder for å hente nettadresser.

/ ** * Vis en liste over ressursen. * * @return Svar * / offentlig funksjon indeks () // Tidligere: retur 'Hei, API'; $ urls = Url :: hvor ('user_id', Auth :: bruker () -> id) -> get (); retur Svar :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200);  / ** * Vis den angitte ressursen. (* id > id) -> hvor ('id', $ id) -> ta (1) -> get (); retur Svar :: json (array ('error' => false, 'urls' => $ url-> tilArray ()), 200); 

La oss teste dem ut:

$ curl -user firstuser: first_password localhost / l4api / public / index.php / api / v1 / url "error": false, "urls": ["created_at": "2013-02-01 02:39: 10 "," beskrivelse ":" En søkemotor "," 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 "," beskrivelse ":" En stor blogg "," id ":" 3 "," updated_at " : "2013-02-01 02:44:34", "url": "http://fideloper.com", "user_id": "1"] $ curl - bruker førstbruker: first_password localhost / l4api / offentlig / index.php / api / v1 / url / 1 "error": false, "urls": ["created_at": "2013-02-01 02:39:10", "beskrivelse": "En søk Motor "," id ":" 2 "," updated_at ":" 2013-02-01 02:39:10 "," url ":" http://google.com "," user_id ":" 1 " ]

Nesten ferdig. La oss nå tillate brukere å slette en URL.

/ ** * Fjern den angitte ressursen fra lagring. * * @param int $ id * @return Svar * / offentlig funksjon ødelegge ($ id) $ url = Url :: hvor ('user_id', Auth :: bruker () -> id) -> finn ($ id) ; $ Url-> slett (); retur Svar :: json (array ('error' => false, 'message' => 'url slettet'), 200); 

Nå kan vi slette en nettadresse ved hjelp av en DELETE-forespørsel:

$ curl -i -X ​​DELETE - bruker førstuser: first_password localhost / l4api / public / index.php / api / v1 / url / 1 HTTP / 1.1 200 OK Dato: Tir, 21 Mai 2013 19:24:19 GMT Innholds- Type: søknad / json "error": false, "message": "URL slettet"

Til slutt, la oss tillate brukere å oppdatere en URL.

/ ** * Oppdater den angitte ressursen som er lagret. * * @param int $ id * @return Svar * / offentlig funksjon oppdatering ($ id) $ url = Url :: hvor ('user_id', Auth :: bruker () -> id) -> finn ($ id) ; hvis (Request :: get ('url')) $ url-> url = Request :: get ('url');  hvis (Request :: get ('description')) $ url-> description = Request :: get ('description');  $ url-> lagre (); retur Svar :: json (array ('error' => false, 'message' => 'url oppdatert'), 200); 

For å teste URL-oppdateringer, kjør:

$ curl -i -X ​​PUT - bruker andre bruker: second_password -d 'url = http: //yahoo.com' localhost / l4api / public / index.php / api / v1 / url / 4 HTTP / 1.1 200 OK Dato: Tirsdag, 21 mai 2013 19:34:21 GMT Innholdstype: søknad / json "error": false, "message": "url oppdatert" // Se våre endringer $ 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", "beskrivelse": "Jeg føler for ham "," id ":" 3 "," updated_at ":" 2013-02-02 18:44:18 "," url ":" http://yahoo.com "," user_id ":" 1 "]

Og det er det

Vi har nå begynnelsen til en fullt fungerende API. Jeg håper at du har lært mye om hvordan du får en API på gang med Laravel 4.

For å oppsummere oppnådde vi følgende i denne leksjonen:

  1. Installer Laravel
  2. Opprett databasen ved hjelp av migrasjoner og sådd
  3. Bruk Eloquent ORM modeller
  4. Godkjen med Basic Auth
  5. Konfigurer ruter, inkludert versjon av API
  6. Opprett API-funksjonaliteten ved hjelp av ressursrike kontrollører

De neste trinnene

Hvis du ønsker å skyve API-en din opp et hakk, kan du vurdere et av følgende som et neste trinn.

  1. Validering (Hint: Laravel har et valideringsbibliotek).
  2. Feilsøking for API-forespørsel - Det er fortsatt mulig å motta HTML-svar på API-forespørsler (Hint: Laravel Error Handling, pluss innholdsforhandling.)
  3. Innholdsforhandlinger - lytter etter aksepteringsoverskriften. (Hint: Laravel's Request Class vil gi deg forespørselsoverskriftene).
  4. Ta en titt på API Craft Google-gruppen.
  5. Lær om de forskjellige typer caching og hvordan Valideringskansering kan forbedre APIen din.
  6. Enhet teste koden din.
  7. Sjekk ut Apigees flotte API-ressurser.
  8. Prøv noen av de nyttige Laravel-skriptene og pluginene som er tilgjengelige på Envato Market.