Laravel 4 A Start met een RESTful API (bijgewerkt)

RESTful API's zijn moeilijk! Er zijn veel aspecten aan het ontwerpen en schrijven van een succesvolle. Sommige van de onderwerpen die u mogelijk tegenkomt, zijn bijvoorbeeld verificatie, hypermedia / HATEOS, versiebeheer, tarieflimieten en inhoudsbemiddeling. In plaats van al deze concepten aan te pakken, laten we ons in plaats daarvan concentreren op de basisprincipes van REST. We maken enkele JSON-eindpunten achter een basisverificatiesysteem en leren een paar Laravel 4-trucs in het proces.

Als je hulp nodig hebt bij je Laravel-ontwikkeling, probeer dan een paar bruikbare Laravel-scripts en plug-ins die beschikbaar zijn op Envato Market.


De app

Laten we een API bouwen voor een eenvoudige Read-It-Later-app. Gebruikers kunnen URL's die ze later willen lezen, maken, lezen, bijwerken en verwijderen.
Klaar om in te duiken en aan de slag te gaan?

Installeer Laravel 4

Maak een nieuwe installatie van Laravel 4. Als u handig bent met CLI, probeer dan deze snelstartgids. Anders hebben we hier een video-zelfstudie over Nettuts + die het proces behandelt.

We gaan eerst een coderingssleutel maken voor veilige hash-hashing. U kunt dit eenvoudig doen door deze opdracht vanuit uw projectroot uit te voeren:

$ php artisan key: genereren

Als alternatief kunt u uw eenvoudig bewerken app / config / app.php coderingssleutel:

/ * | ----------------------------------------------- --------------------------- | Coderingssleutel | ----------------------------------------------- --------------------------- | | Deze sleutel wordt gebruikt door de Illuminate-encryptorservice en moet worden ingesteld op | naar een willekeurige lange string, anders zullen deze gecodeerde waarden niet | wees veilig. Zorg ervoor dat u deze wijzigt voordat u een toepassing implementeert! | * / 'key' => md5 ('dit is een manier om een ​​coderingssleutel in te stellen'),

Database

Zodra je een werkende installatie van Laravel 4 hebt, kunnen we beginnen met het plezier. We beginnen met het maken van de database van de app.

Hiervoor zijn slechts twee databasetabellen nodig:

  1. gebruikers, inclusief een gebruikersnaam en wachtwoord
  2. URL's, inclusief een url en beschrijving

We zullen Laravel's migraties gebruiken om de database te maken en te vullen.

Configureer uw database

Bewerk app / config / database.php en vul het met uw database-instellingen. Opmerking: dit betekent dat er een database moet worden gemaakt voor deze toepassing. Dit artikel gaat uit van een MySQL-database.

'verbindingen' => array ('mysql' => array ('stuurprogramma' => 'mysql', 'host' => 'localhost', 'database' => 'read_it_later', 'gebruikersnaam' => 'uw_gebruikersnaam', 'wachtwoord' => 'your_password', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => ",),),

Maak migratiebestanden

$ php artisan migrate: make create_users_table --table = users - maak $ php artisan migrate: make create_urls_table --table = urls - maak

Met deze opdrachten worden de basissmigratiescripts ingesteld die we zullen gebruiken om de databasetabellen te maken. Onze taak is nu om ze te vullen met de juiste tabelkolommen.

Bewerk app / databank / migraties / SOME_DATE_create_users_table.php en toevoegen aan de up () methode:

public function up () Schema :: create ('users', function (Blueprint $ table) $ table-> increments ('id'); $ table-> string ('gebruikersnaam') -> unique (); $ tabel-> string ('wachtwoord'); $ table-> timestamps ();); 

Hierboven stellen we een gebruikersnaam in (die uniek zou moeten zijn), een wachtwoord en de tijdstempels. Bewaar dat, en nu bewerken app / databank / migraties / SOME_DATE_create_urls_table.php, en toevoegen aan de up () methode:

public function up () Schema :: create ('urls', functie (Blueprint $ table) $ table-> increments ('id'); $ table-> integer ('user_id'); $ table-> string ( 'url'); $ table-> string ('description'); $ table-> timestamps ();); 

De enige belangrijke opmerking in dit fragment is dat we een koppeling maken tussen de url en gebruikers tafel, via de gebruikersnaam veld-.

Voeg voorbeeldgebruikers toe

We kunnen de zaden van Laravel gebruiken om een ​​paar voorbeeldgebruikers te maken.

Maak een bestand binnen de app / databank / zaden map met dezelfde naam als de tabel waarmee deze overeenkomt; in ons geval, UserTableSeeder.php. Toevoegen:

verwijderen (); Gebruiker :: create (array ('gebruikersnaam' => 'firstuser', 'password' => hash: make ('first_password'))); Gebruiker :: create (array ('gebruikersnaam' => 'seconduser', 'password' => hash: make ('second_password'))); 

Zorg er vervolgens voor dat de seeder-klasse wordt uitgevoerd wanneer de database wordt geplaatst. Bewerk app / databank / zaden / DatabaseSeeder.php:

public function run () Eloquent :: unguard (); // Voeg deze regel toe of verwijder deze $ this-> call ('UserTableSeeder'); 

Voer de migraties uit

Ga als volgt te werk om die twee tabellen te maken en voeg onze voorbeeldgebruikers toe.

// Maak de twee tabellen $ php artisan migrate // Maak de voorbeeldgebruikers $ php artisan db: seed

modellen

Laravel 4 blijft de uitstekende Eloquent ORM gebruiken. Dit maakt het verwerken van databaseaanvragen een fluitje van een cent. We hebben één model per tafel nodig.

Gelukkig wordt Laravel geleverd met een gebruikersmodel, dus laten we een model maken voor onze URL-tabel.

Maak en bewerk bestand app / modellen / Url.php.

 

authenticatie

De filters van Laravel kunnen de authenticatie voor ons aan. In het bijzonder wordt Laravel nu geleverd met een basisverificatiefilter, dat we kunnen gebruiken als een snel authenticatiemodel dat kan worden gebruikt met onze API-verzoeken.

Als je opent app / filters.php, je zult zien hoe het eruit ziet:

Route :: filter ('auth.basic', function () return Auth :: basic (););

We hoeven slechts één aanpassing aan te brengen. Standaard zoekt dit filter naar een veld 'e-mailadres' om de gebruiker te identificeren. Omdat we gebruikersnamen gebruiken in plaats van e-mails, hoeven we alleen die voorkeur aan te passen. Verander de Auth :: basis- () bel door ons veld gebruikersnaam als parameter te gebruiken:

Route :: filter ('auth.basic', function () return Auth :: basic ("gebruikersnaam"););

routes

Laten we dit uittesten. Maak een route, genaamd testauth, en zorg ervoor dat onze auth.basic filter draait ervoor.

Bewerk app / routes.php:

Route :: get ('/ authtest', array ('before' => 'auth.basic', function () return View :: make ('hallo');));

We kunnen dit testen met een krulverzoek. Probeer vanuit je terminal naar je build van Laravel te wijzen. In de mijne ziet het er zo uit (uw URL zal waarschijnlijk anders zijn!):

$ curl -i localhost / l4api / public / index.php / authtest HTTP / 1.1 401 Niet-geautoriseerde datum: di, 21 mei 2013 18:47:59 GMT WWW-Authenticate: Basic Vary: Accept-Encoding Content-Type: text / html ; charset = UTF-8 Ongeldige inloggegevens

Zoals u kunt zien, wordt een niet-geautoriseerd verzoek gedetecteerd en wordt het bericht 'Ongeldige referenties' geretourneerd met een 401-statuscode. Probeer vervolgens basisverificatie in te voeren.

$ curl --user firstuser: first_password localhost / l4api / public / index.php / authtest HTTP / 1.1 200 OK Datum: di, 21 mei 2013 18:50:51 GMT Vary: Accept-Encoding Content-Type: text / html; charset = UTF-8 

Hallo Wereld!

Het werkte!

Op dit punt is het basiswerk van onze API klaar. Wij hebben:

  • Laravel 4 geïnstalleerd
  • Onze database gemaakt
  • Onze modellen gemaakt
  • Een authenticatiemodel gemaakt

Functionele verzoeken maken

Misschien kent u de RESTful-controllers van Laravel. Ze bestaan ​​nog steeds in Laravel 4; we kunnen echter ook de vindingrijke controllers van Laravel gebruiken, die een aantal paradigma's opzetten die we kunnen gebruiken om een ​​consistente API-interface te maken. We zullen een vindingrijke controller gebruiken.

Hier is een overzicht van wat elke methode in de vindingrijke controller zal verwerken. Houd er rekening mee dat u de / resource / create en / resource / id / edit-routes kunt verwijderen, omdat we geen 'create' of 'edit'-formulieren in een API hoeven te tonen.

Maak een vindingrijke controller

$ php artisan controller: maak UrlController

Stel vervolgens een route in om de controller te gebruiken en eis dat elke route wordt geauthenticeerd.

Bewerk app / routes.php en voeg toe:

// Routegroep voor API-versiebeheer Route :: group (array ('prefix' => 'api / v1', 'before' => 'auth.basic'), function () Route :: resource ('url', 'UrlController'););

Er gebeuren daar een paar dingen.

  1. Dit gaat reageren op verzoeken aan http://example.com/api/v1/url.
  2. Dit stelt ons in staat om extra routes toe te voegen, als we onze API moeten uitbreiden. Als u bijvoorbeeld een gebruikerseindpunt toevoegt, zoals / Api / v1 / user.
  3. Er is ook een naamgevingsmechanisme voor de versie-indeling van onze API. Dit geeft ons de mogelijkheid om nieuwe API-versies uit te rollen zonder oudere versies te verbreken - We kunnen eenvoudig een v2 routegroep en wijs deze naar een nieuwe controller!

Opmerking: mogelijk wilt u geavanceerdere API-versie-indelingstechnieken overwegen, zoals het gebruik van een Aanvaarden koptekst of subdomein waarmee u verschillende code-versies van afzonderlijke API-versies kunt aanwijzen.

Voeg de functionaliteit toe

Bewerk de nieuwe app / controllers / UrlController.php het dossier:

// Bewerk dit: public function index () return 'Hallo, API'; 

Laten we het testen:

$ curl -i localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 401 Niet-geautoriseerde datum: di 21 mei 2013 19:02:59 GMT WWW-Authenticate: Basic Vary: Accept-Encoding Content-Type : text / html; charset = UTF-8 Ongeldige inloggegevens. $ curl --user firstuser: first_password localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 200 OK Datum: di, 21 mei 2013 19:04:19 GMT Vary: Accept-Encoding Content-Type: text / html; charset = UTF-8 Hallo, API

We hebben nu een vindingrijke controller met authenticatie aan het werk en zijn klaar om functionaliteit toe te voegen.

Maak een URL

Bewerk app / controllers / UrlController.php:

/ ** * Bewaar een nieuw gecreëerde bron in opslag. * * @return Response * / public function store () $ url = nieuwe URL; $ url-> url = Verzoek: get ('url'); $ url-> description = Request: get ('description'); $ url-> user_id = Auth :: user () -> id; // Validatie en filtering is hard nodig !! // Serieus, ik ben een slecht persoon om dat achter te laten. $ URL-> save (); return Response :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200); 

Het is tijd om dit te testen met een ander krulverzoek. Deze stuurt een POST-aanvraag, die overeenkomt met de op te slaan() methode hierboven gemaakt.

$ curl -i - user firstuser: first_password -d 'url = http: //google.com&description=A Search Engine' localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 201 gecreëerde datum: di , 21 mei 2013 19:10:52 GMT inhoudstype: application / json "error": false, "message": "URL created"

Stoer! Laten we er nog een paar maken voor onze beide gebruikers.

$ curl --user firstuser: first_password -d 'url = http: //fideloper.com&description=A Great Blog' localhost / l4api / public / index.php / api / v1 / url $ curl --user tweedeuser: second_password -d 'url = http: //digitalsurgeons.com&description=A Marketingbureau' localhost / l4api / public / index.php / api / v1 / url $ curl --user tweedeuser: second_password -d 'url = http: //www.poppstrong .com / & description = Ik voel voor hem 'localhost / l4api / public / index.php / api / v1 / url

Laten we vervolgens methoden voor het ophalen van URL's maken.

/ ** * Een lijst van de resource weergeven. * * @return Response * / public function index () // Vroeger: return 'Hallo, API'; $ urls = Url :: where ('user_id', Auth :: user () -> id) -> get (); return Response :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200);  / ** * Geef de opgegeven resource weer. * * @param int $ id * @return Response * / public function show ($ id) // Zorg dat de huidige gebruiker eigenaar is van de gevraagde resource $ url = Url :: where ('user_id', Auth :: user () - > id) -> where ('id', $ id) -> take (1) -> get (); return Response :: json (array ('error' => false, 'urls' => $ url-> toArray ()), 200); 

Laten we ze testen:

$ curl --user firstuser: first_password localhost / l4api / public / index.php / api / v1 / url "error": false, "urls": ["created_at": "2013-02-01 02:39: 10 "," description ":" A Search Engine "," 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 "," description ":" A Great Blog "," id ":" 3 "," updated_at " : "2013-02-01 02:44:34", "url": "http://fideloper.com", "user_id": "1"] $ curl --user firstuser: first_password localhost / l4api / public / index.php / api / v1 / url / 1 "error": false, "urls": ["created_at": "2013-02-01 02:39:10", "description": "A Search Engine "," id ":" 2 "," updated_at ":" 2013-02-01 02:39:10 "," url ":" http://google.com "," user_id ":" 1 " ]

Bijna klaar. Laten we nu toestaan ​​dat gebruikers een URL verwijderen.

/ ** * Verwijder de opgegeven bron uit de opslag. * * @param int $ id * @return Response * / public function destroy ($ id) $ url = URL :: where ('user_id', Auth :: user () -> id) -> find ($ id) ; $ URL-> delete (); return Response :: json (array ('error' => false, 'message' => 'url deleted'), 200); 

Nu kunnen we een URL verwijderen met behulp van een DELETE-verzoek:

$ curl -i -X ​​DELETE - user firstuser: first_password localhost / l4api / public / index.php / api / v1 / url / 1 HTTP / 1.1 200 OK Datum: di 21 mei 2013 19:24:19 GMT Content- Typ: application / json "error": false, "message": "url deleted"

Laten we ten slotte toestaan ​​dat gebruikers een URL bijwerken.

/ ** * Werk de opgegeven resource bij in de opslag. * * @param int $ id * @return Response * / update openbare functie ($ id) $ url = URL :: where ('user_id', Auth :: user () -> id) -> find ($ id) ; if (Request :: get ('url')) $ url-> url = Request: get ('url');  if (Request :: get ('description')) $ url-> description = Request: get ('description');  $ url-> save (); return Response :: json (array ('error' => false, 'message' => 'url updated'), 200); 

Ga als volgt te werk om URL-updates te testen:

$ 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 Datum: Tue, 21 May 2013 19:34:21 GMT Content-Type: application / json "error": false, "message": "url updated" // Bekijk onze wijzigingen $ 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", "description": "I feel for him "," id ":" 3 "," updated_at ":" 2013-02-02 18:44:18 "," url ":" http://yahoo.com "," user_id ":" 1 "]

En dat is het

We hebben nu het begin van een volledig functionerende API. Ik hoop dat je veel hebt geleerd over hoe je een API kunt starten met Laravel 4.

Om samen te vatten, hebben we het volgende bereikt in deze les:

  1. Installeer Laravel
  2. Maak de database aan met behulp van migraties en seeding
  3. Gebruik Eloquent ORM-modellen
  4. Verifiëren met basisverificatie
  5. Routes instellen, inclusief versiebeheer van de API
  6. Maak de API-functionaliteit met behulp van vindingrijke controllers

De volgende stappen

Als u uw API een stapje hoger wilt duwen, kunt u een van de volgende dingen overwegen als volgende stap.

  1. Validatie (Hint: Laravel heeft een validatiebibliotheek).
  2. Verwerking van API-aanvraagfouten - Het is nog steeds mogelijk om HTML-reacties op API-aanvragen te ontvangen (Hint: Laravel-foutafhandeling, plus inhoudonderhandeling.)
  3. Contentonderhandeling - luisteren naar de Accept-header. (Hint: Laravel's Request Class geeft je de verzoek headers).
  4. Bekijk de API Craft Google-discussiegroep.
  5. Lees meer over de verschillende typen caching en hoe Validation Caching uw API kan verbeteren.
  6. Unit test uw code.
  7. Bekijk de geweldige API-bronnen van Apigee.
  8. Probeer enkele bruikbare Laravel-scripts en plug-ins die beschikbaar zijn op Envato Market.