Laravel 4 A Starta på ett RESTful API (uppdaterat)

RESTful API är svårt! Det finns många aspekter att designa och skriva en framgångsrik. Exempelvis kan några av de ämnen som du kan hitta dig själv hantera inkludera autentisering, hypermedia / HATEOS, versionering, hastighetsbegränsningar och innehållsförhandlingar. I stället för att ta itu med alla dessa begrepp, låt oss istället fokusera på grunderna för REST. Vi gör några JSON-slutpunkter bakom ett grundläggande autentiseringssystem, och lär dig några Laravel 4-tricks i processen.

Om du behöver hjälp med din Laravel-utveckling, kan du prova några av de användbara Laravel-skript och plugins som finns på Envato Market.


Appen

Låt oss bygga ett API för en enkel Read-It-Later-app. Användare kommer att kunna skapa, läsa, uppdatera och ta bort webbadresser som de vill läsa senare.
Klar för att dyka in och komma igång?

Installera Laravel 4

Skapa en ny installation av Laravel 4. Om du är praktisk med CLI kan du prova den här snabbstartguiden. Annars har vi en videohandledning här på Nettuts + som täcker processen.

Vi ska först skapa en krypteringsnyckel för säker lösenordshackning. Du kan enkelt göra det här genom att köra det här kommandot från din projektrot:

$ php hantverksnyckel: generera

Alternativt kan du enkelt redigera din app / config / app.php krypteringsnyckel:

/ * | ----------------------------------------------- --------------------------- | Krypteringsnyckel | ----------------------------------------------- --------------------------- | | Denna nyckel används av Illuminate Encrypter-tjänsten och bör ställas in | till en slumpmässig, lång sträng, annars kommer dessa krypterade värden inte att | var försiktig. Var noga med att ändra den innan du använder någon applikation! | * / 'key' => md5 ('detta är ett sätt att få en krypteringsnyckeluppsättning'),

Databas

När du har en fungerande installation av Laravel 4 kan vi börja med det roliga. Vi börjar med att skapa appens databas.

Detta kräver bara två databas tabeller:

  1. användare, inklusive ett användarnamn och lösenord
  2. Webbadresser adresser~~POS=HEADCOMP, inklusive en webbadress och beskrivning

Vi använder Laravels migreringar för att skapa och fylla i databasen.

Konfigurera din databas

Redigera app / config / database.php och fyll i den med dina databasinställningar. Obs! Det här innebär att skapa en databas för att denna applikation ska kunna användas. Den här artikeln förutsätter en MySQL-databas.

'connections' => array ('mysql' => array ('drivrutin' => 'mysql', 'värd' => 'localhost', 'database' => 'read_it_later', 'användarnamn' => 'ditt_namn' 'password' =>' your_password ',' charset '=>' utf8 ',' collation '=>' utf8_unicode_ci ',' prefix '=> ",),),

Skapa migrationsfiler

$ php artisan migrera: skapa create_users_table --table = users --create $ php artisan migrera: skapa create_urls_table --table = urls - skapa

Dessa kommandon ställer in de grundläggande migreringsskript som vi ska använda för att skapa databastabellerna. Vårt jobb är nu att fylla dem med rätt tabellkolumner.

Redigera app / databas / migreringar / SOME_DATE_create_users_table.php och lägg till i upp() metod:

public function up () Schema :: skapa ('användare', funktion (Blueprint $ tabell) $ tabell-> steg ('id'); $ table-> string ('användarnamn') -> unikt (); $ tabell-> sträng ('lösenord'); $ tabell-> tidsstämplar ();); 

Ovan ställer vi in ​​ett användarnamn (vilket borde vara unikt), ett lösenord och tidstämplarna. Spara det och redigera nu app / databas / migreringar / SOME_DATE_create_urls_table.php, och lägg till i upp() metod:

(funktion) uppe 'url'); $ tabell-> sträng ('beskrivning'); $ tabell-> tidsstämplar ();); 

Den enda viktiga anmärkningen i det här utdraget är att vi skapar en länk mellan url och användare bord, via användar ID fält.

Lägg till exempel användare

Vi kan använda Laravels frön för att skapa några exempelanvändare.

Skapa en fil inom app / databas / frön mapp som har samma namn som det bord som det motsvarar; i vårat fall, UserTableSeeder.php. Lägg till:

radera(); Användare :: skapa (array ('användarnamn' => 'firstuser', 'password' => Hash :: make ('first_password'))); Användare :: skapa (array ('username' => 'seconduser', 'password' => Hash :: make ('second_password'))); 

Se till att seeder-klassen körs när databasen är sådd. Redigera app / databas / frön / DatabaseSeeder.php:

public function run () Eloquent :: unguard (); // Lägg till eller Okomment denna rad $ this-> call ('UserTableSeeder'); 

Kör migreringarna

Så här skapar du de två tabellerna och lägger in våra exempelanvändare.

// Skapa de två tabellerna $ php artisan migrera // Skapa provanvändarna $ php artisan db: seed

modeller

Laravel 4 fortsätter att använda den utmärkta Eloquent ORM. Detta kommer att göra processen att hantera databassamtal en snap. Vi behöver en modell per bord.

Lyckligtvis kommer Laravel med en användarmodellinställning, så låt oss skapa en modell för vårt url-bord.

Skapa och redigera fil app / modeller / Url.php.

 

autentisering

Laravel s filter kan hantera autentisering för oss. I synnerhet kommer Laravel med ett Basic Authentication-filter, som vi kan använda som en snabb autentiseringsmodell som ska användas med våra API-förfrågningar.

Om du öppnar app / filters.php, du ser hur det ser ut:

Rutt :: filter ('auth.basic', funktion () return Auth :: basic (););

Vi behöver bara göra en justering. Som standard letar det här filtret efter ett "e-mail" -fält för att identifiera användaren. Eftersom vi använder användarnamn istället för e-postmeddelanden behöver vi bara justera den inställningen. Ändra Auth :: basic () ring genom att ge det vårt användarnamn fält som en parameter:

Rutt :: filter ('auth.basic', funktion () return Auth :: basic ("användarnamn"););

rutter

Låt oss testa detta. Skapa en rutt, kallad testauth, och se till att vår auth.basic filteret kör före det.

Redigera app / routes.php:

Rutt :: få ('/ authtest', array ('före' => 'auth.basic', funktion () returnera Visa :: make ('hej');));

Vi kan testa detta med en curl-förfrågan. Från din terminal, försök peka på din byggnad av Laravel. I min ser det ut så här (Din webbadress kommer sannolikt att vara annorlunda!):

$ curl -i localhost / l4api / public / index.php / authtest HTTP / 1.1 401 Obehörigt datum: tis, 21 maj 2013 18:47:59 GMT WWW-Authenticate: Basic Vary: Acceptera -kodning innehållstyp: text / html ; charset = UTF-8 Ogiltiga uppgifter

Som du kan se upptäcks en obehörig förfrågan och ett meddelande "Ogiltiga referenser" returneras med en 401-statuskod. Försök sedan med grundläggande autentisering.

$ curl - användarens första användare: first_password localhost / l4api / public / index.php / authtest HTTP / 1.1 200 OK Datum: tis, 21 maj 2013 18:50:51 GMT Variera: Acceptera -kodning Innehållstyp: text / html; charset = UTF-8 

Hej världen!

Det fungerade!

Vid denna tidpunkt är baslinjearbetet i vårt API gjort. Vi har:

  • Installerad Laravel 4
  • Skapat vår databas
  • Skapat våra modeller
  • Skapat en autentiseringsmodell

Skapa funktionella förfrågningar

Du kanske är bekant med Laravels RESTful-kontrollerare. De finns fortfarande i Laravel 4; Vi kan dock också använda Laravels Resourceful Controllers, som skapar några paradigmer som vi kan använda för att skapa ett konsekvent API-gränssnitt. Vi använder en resursfull kontroller.

Här är en sammanfattning av vad varje metod i den resursfulla regulatorn ska hantera. Observera att du kan ta bort / resurs / skapa och / resurs / id / redigera rutter, eftersom vi inte behöver visa "skapa" eller "redigera" formulär i ett API.

Skapa en resursfull kontrollör

$ php artisan controller: gör UrlController

Installera sedan en rutt för att använda regulatorn, och kräva att varje rutt ska verifieras.

Redigera app / routes.php och lägg till:

// Ruttgrupp för API-versionering Rutt :: grupp (array ('prefix' => 'api / v1', 'före' => 'auth.basic'), funktion () Rutt :: resurs ('url' 'UrlController'););

Några saker händer där.

  1. Detta kommer att svara på framställningar gjorda http://example.com/api/v1/url.
  2. Detta tillåter oss att lägga till extra rutter, om vi behöver expandera vårt API. Om du till exempel lägger till en användarens slutpunkt, t.ex. / Api / v1 / användare.
  3. Det finns också en namngivningsmekanism för versioning av vårt API. Detta ger oss möjlighet att rulla ut nya API-versioner utan att bryta äldre versioner - vi kan helt enkelt skapa en v2 ruttgrupp och peka på den till en ny kontroller!

Obs! Du kanske vill överväga mer avancerade API-versioneringstekniker, till exempel att använda en Acceptera rubrik eller underdomän som kan hjälpa dig att peka på olika API-versioner separata kodbaser.

Lägg till funktionen

Redigera det nya app / controllers / UrlController.php fil:

// Redigera detta: Public Function Index () returnera "Hej, API"; 

Låt oss testa det:

$ curl -i localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 401 Obehörigt datum: tis, 21 maj 2013 19:02:59 GMT WWW-Authenticate: Basic Vary: Accept-Encoding Content Type : text / html; charset = UTF-8 Ogiltiga uppgifter. $ curl -user firstuser: first_password localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 200 OK Datum: tis, 21 maj 2013 19:04:19 GMT Variera: Acceptera -kodning Innehållstyp: text / html; charset = UTF-8 Hej, API

Vi har nu en resursfull kontroller med autentiseringsarbete och är redo att lägga till funktionalitet.

Skapa en webbadress

Redigera app / controllers / UrlController.php:

/ ** * Spara en nyskapad resurs i lagring. * * @return Response * / public function store () $ url = ny Url; $ url-> url = Förfrågan :: get ('url'); $ url-> description = Request :: get ('description'); $ url-> user_id = Auth :: användare () -> id; // Validering och filtrering är absolut nödvändigt !! // Seriöst är jag en dålig person för att lämna det ut. $ URL-> Spara (); returnera Svar :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200); 

Det är dags att testa detta med en annan curl-förfrågan. Den här kommer att skicka en POST-förfrågan, som motsvarar Lagra() metod skapad ovan.

$ curl -i - användarens första användare: first_password -d 'url = http: //google.com&description=A sökmotor' localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 201 Skapad datum: tis , 21 maj 2013 19:10:52 GMT Content-Type: application / json "error": false, "message": "URL skapad"

Häftigt! Låt oss skapa några fler, för båda våra användare.

$ curl - användarens första användare: first_password -d 'url = http: //fideloper.com&description=A Stor blogg' localhost / l4api / public / index.php / api / v1 / url $ curl - användaren seconduser: second_password -d 'url = http: //digitalsurgeons.com&description=A marknadsföringsbyrå' localhost / l4api / public / index.php / api / v1 / url $ curl - användaren seconduser: second_password -d 'url = http: //www.poppstrong .com / & description = Jag känner för honom "localhost / l4api / public / index.php / api / v1 / url

Låt oss sedan skapa metoder för att hämta webbadresser.

/ ** * Visa en lista över resursen. * * @return Response * / public function index () // Tidigare: returnera "Hej, API"; $ urls = Url :: where ('user_id', Auth :: user () -> id) -> get (); returnera Svar :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200);  / ** * Visa den angivna resursen. (* id =) > id) -> var ('id', $ id) -> ta (1) -> get (); returnera Svar :: json (array ('error' => false, 'urls' => $ url-> toArray ()), 200); 

Låt oss testa 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 "," beskrivning ":" En sökmotor "," 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 "," beskrivning ":" En stor blogg "," id ":" 3 "," updated_at " : "2013-02-01 02:44:34", "url": "http://fideloper.com", "user_id": "1"] $ curl - användarens första användare: first_password localhost / l4api / public / index.php / api / v1 / url / 1 "error": false, "urls": ["created_at": "2013-02-01 02:39:10", "beskrivning": "En sökning Motor "," id ":" 2 "," updated_at ":" 2013-02-01 02:39:10 "," url ":" http://google.com "," user_id ":" 1 " ]

Nästan klar. Låt oss nu tillåta användare att radera en webbadress.

/ ** * Ta bort den angivna resursen från lagring. * * @param int $ id * @return Svar * / allmän funktion förstör ($ id) $ url = Url :: where ('user_id', Auth :: user () -> id) -> hitta ($ id) ; $ URL-> Delete (); returnera Svar :: json (array ('error' => false, 'message' => 'url raderat'), 200); 

Nu kan vi ta bort en webbadress med hjälp av en DELETE-förfrågan:

$ curl -i -X ​​DELETE - användarens första användare: first_password localhost / l4api / public / index.php / api / v1 / url / 1 HTTP / 1.1 200 OK Datum: tis 21 maj 2013 19:24:19 GMT Content- Typ: ansökan / json "error": false, "message": "url borttaget"

Till sist, låt oss tillåta användare att uppdatera en webbadress.

/ ** * Uppdatera den angivna resursen i lagring. ($ id) -> hitta ($ id) ; om (Begär :: få ('url')) $ url-> url = Begär :: få ('url');  om (Begär :: få ('beskrivning')) $ url-> description = Request :: get ('description');  $ url-> spara (); returnera Svar :: json (array ('error' => false, 'message' => 'url uppdaterat'), 200); 

För att testa URL-uppdateringar, kör:

$ curl -i -X ​​PUT - Användare seconduser: second_password -d 'url = http: //yahoo.com' localhost / l4api / public / index.php / api / v1 / url / 4 HTTP / 1.1 200 OK Datum: Tis 21 maj 2013 19:34:21 GMT Content-Type: application / json "error": false, "message": "url uppdaterad" // Se våra ändringar $ 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", "beskrivning": "I känner för honom "," id ":" 3 "," updated_at ":" 2013-02-02 18:44:18 "," url ":" http://yahoo.com "," user_id ":" 1 "]

Och det är allt

Vi har nu början på ett fullt fungerande API. Jag hoppas att du har lärt dig mycket om hur du får ett API på gång med Laravel 4.

För att återskapa uppnådde vi följande i denna lektion:

  1. Installera Laravel
  2. Skapa databasen med migreringar och sådd
  3. Använd Eloquent ORM-modeller
  4. Godkänn med Basic Auth
  5. Skapa rutor, inklusive version av API
  6. Skapa API-funktionaliteten med hjälp av Resourceful Controllers

Nästa steg

Om du vill driva ditt API uppåt, kan du överväga något av följande som ett nästa steg.

  1. Validering (tips: Laravel har ett valideringsbibliotek).
  2. Felbehandling av API-förfrågan - Det är fortfarande möjligt att få HTML-svar på API-förfrågningar (Hint: Laravel Error Handling, plus innehållsförhandling.)
  3. Content Negotiation - lyssna på Accept header. (Hint: Laravels begäransklass kommer att ge dig förfrågningsrubrikerna).
  4. Kolla in API Craft Google-gruppen.
  5. Läs om olika typer av cachning och hur Valideringskachning kan förbättra ditt API.
  6. Enhet testa din kod.
  7. Kolla in Apigees stora API-resurser.
  8. Prova några av de användbara Laravel-skript och plugins som finns på Envato Market.