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.
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?
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'),
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:
Vi använder Laravels migreringar för att skapa och fylla i databasen.
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 '=> ",),),
$ 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.
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');
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
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årauth.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 uppgifterSom 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-8Hej världen!
Det fungerade!
Vid denna tidpunkt är baslinjearbetet i vårt API gjort. Vi har:
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.
$ 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.
http://example.com/api/v1/url
./ Api / v1 / användare
.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.
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.
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 "]
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:
Om du vill driva ditt API uppåt, kan du överväga något av följande som ett nästa steg.