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.
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?
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'),
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:
Vi bruker Laravel's migrasjoner for å lage og fylle databasen.
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' => ",),
$ 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.
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');
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ø
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årauth.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 legitimasjonSom 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-8Hei Verden!
Det funket!
På dette tidspunktet er baselinearbeidet til API-en vår ferdigstilt. Vi har:
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.
$ 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.
http://example.com/api/v1/url
./ Api / v1 / bruker
.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.
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.
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 "]
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:
Hvis du ønsker å skyve API-en din opp et hakk, kan du vurdere et av følgende som et neste trinn.