Laravel 4 Ein Start bei einer RESTful-API (aktualisiert)

RESTful-APIs sind hart! Es gibt viele Aspekte für das Entwerfen und Schreiben eines erfolgreichen. Zu den Themen, die Sie möglicherweise behandeln, gehören beispielsweise Authentifizierung, Hypermedia / HATEOS, Versionierung, Ratenbeschränkungen und Inhaltsverhandlungen. Anstatt sich all diesen Konzepten zu widmen, konzentrieren wir uns jedoch auf die Grundlagen von REST. Wir werden einige JSON-Endpunkte hinter einem einfachen Authentifizierungssystem erstellen und dabei ein paar Laravel 4-Tricks lernen.

Wenn Sie Hilfe bei der Entwicklung von Laravel benötigen, probieren Sie einige der nützlichen Laravel-Skripts und Plugins aus, die auf Envato Market erhältlich sind.


Die App

Erstellen wir eine API für eine einfache Read-It-Later-App. Benutzer können URLs erstellen, lesen, aktualisieren und löschen, die sie später lesen möchten.
Bereit zum Eintauchen und loslegen?

Installieren Sie Laravel 4

Erstellen Sie eine neue Installation von Laravel 4. Wenn Sie mit CLI vertraut sind, probieren Sie diese Kurzanleitung. Ansonsten haben wir hier auf Nettuts + ein Video-Tutorial, das den Prozess abdeckt.

Wir erstellen zunächst einen Verschlüsselungsschlüssel für sicheres Passwort-Hashing. Sie können dies leicht tun, indem Sie diesen Befehl in Ihrem Projektstamm ausführen:

$ php Handwerker-Schlüssel: generieren

Alternativ können Sie einfach Ihr bearbeiten app / config / app.php Verschlüsselungsschlüssel:

/ * | ------------------------------------------- --------------------------- | Verschlüsselungsschlüssel | ------------------------------------------- --------------------------- | | Dieser Schlüssel wird vom Illuminate-Verschlüsselungsdienst verwendet und sollte | gesetzt werden zu einer zufälligen, langen Zeichenfolge, andernfalls werden diese verschlüsselten Werte nicht | sicher sein. Stellen Sie sicher, dass Sie es ändern, bevor Sie eine Anwendung bereitstellen! | * / 'key' => md5 ('Dies ist eine Möglichkeit, einen Verschlüsselungsschlüssel-Satz zu erhalten'),

Datenbank

Sobald Sie Laravel 4 installiert haben, können wir mit dem Spaß loslegen. Wir beginnen mit der Erstellung der Datenbank der App.

Dies erfordert nur zwei Datenbanktabellen:

  1. Benutzer, inklusive Benutzername und Passwort
  2. URLs, einschließlich einer URL und einer Beschreibung

Wir werden die Migrationen von Laravel verwenden, um die Datenbank zu erstellen und aufzufüllen.

Konfigurieren Sie Ihre Datenbank

Bearbeiten app / config / database.php und füllen Sie es mit Ihren Datenbankeinstellungen. Hinweis: Dies bedeutet, dass Sie eine Datenbank erstellen, die von dieser Anwendung verwendet werden soll. Dieser Artikel setzt eine MySQL-Datenbank voraus.

'verbindungen' => array ('mysql' => array ('driver' => 'mysql', 'host' => 'localhost', 'database' => 'read_it_later'), 'username' => 'your_username', 'password' => 'your_password', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => ",),),

Erstellen Sie Migrationsdateien

$ php Handwerker-Migration: make create_users_table --table = Benutzer --create $ php Handwerker-Migration: make create_urls_table --table = urls --create

Diese Befehle richten die grundlegenden Migrationsskripts ein, die zum Erstellen der Datenbanktabellen verwendet werden. Unsere Aufgabe ist es nun, sie mit den richtigen Tabellenspalten zu füllen.

Bearbeiten app / database / migrations / SOME_DATE_create_users_table.php und zum hinzufügen oben() Methode:

public function up () Schema :: create ('Benutzer', Funktion (Blueprint $ -Tabelle) $ table-> inkrementiert ('id'); $ table-> string ('username') -> unique (); $; table-> string ('password'); $ table-> timestamps ();); 

Oben setzen wir einen Benutzernamen (der eindeutig sein sollte), ein Passwort sowie die Zeitstempel. Speichern Sie das und bearbeiten Sie jetzt app / database / migrations / SOME_DATE_create_urls_table.php, und zum hinzufügen oben() Methode:

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

Der einzige wichtige Hinweis in diesem Snippet ist, dass wir eine Verknüpfung zwischen dem erstellen url und Benutzer Tisch, über die Benutzeridentifikation Feld.

Beispielbenutzer hinzufügen

Wir können Laravel-Samen verwenden, um einige Beispielbenutzer zu erstellen.

Erstellen Sie eine Datei innerhalb der App / Datenbank / Saatgut Ordner, der denselben Namen wie die Tabelle hat, der er entspricht; in unserem Fall, UserTableSeeder.php. Hinzufügen:

löschen(); Benutzer :: create (array ('username' => 'firstuser', 'password' => Hash :: make ('first_password'))); Benutzer :: create (array ('username' => 'seconduser', 'password' => Hash :: make ('second_password'))); 

Stellen Sie als Nächstes sicher, dass die Seeder-Klasse ausgeführt wird, wenn die Datenbank erstellt wurde. Bearbeiten app / datenbank / seeds / DatabaseSeeder.php:

öffentliche Funktion run () Eloquent :: unguard (); // Diese Zeile hinzufügen oder auskommentieren $ this-> call ('UserTableSeeder'); 

Führen Sie die Migrationen aus

So erstellen Sie diese beiden Tabellen und fügen unsere Beispielbenutzer ein.

// Erstellen Sie die beiden Tabellen $ php artisan migrate // Erstellen Sie die Beispielbenutzer $ php artisan db: seed

Modelle

Laravel 4 verwendet weiterhin den ausgezeichneten Eloquent-ORM. Dadurch wird die Verarbeitung von Datenbankaufrufen zu einem Kinderspiel. Wir benötigen ein Modell pro Tabelle.

Zum Glück verfügt Laravel über ein Benutzermodell-Setup, also erstellen wir ein Modell für unsere URL-Tabelle.

Datei erstellen und bearbeiten app / models / Url.php.

 

Authentifizierung

Die Filter von Laravel können die Authentifizierung für uns erledigen. Insbesondere verfügt Laravel jetzt über einen Basisauthentifizierungsfilter, den wir als schnelles Authentifizierungsmodell für unsere API-Anforderungen verwenden können.

Wenn du öffnest app / filters.php, Sie werden sehen, wie es aussieht:

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

Wir müssen nur eine Anpassung vornehmen. Standardmäßig sucht dieser Filter nach einem "E-Mail" -Feld, um den Benutzer zu identifizieren. Da wir Benutzernamen anstelle von E-Mails verwenden, müssen wir diese Einstellung lediglich anpassen. Ändere das Auth :: basic () rufen Sie an, indem Sie unser Benutzername-Feld als Parameter angeben:

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

Routen

Lass uns das testen. Erstellen Sie eine Route, genannt testauth, und stellen Sie sicher, dass unsere auth.basic Filter läuft davor.

Bearbeiten app / routes.php:

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

Wir können dies mit einer Curl-Anfrage testen. Versuchen Sie von Ihrem Terminal aus, auf Ihren Laravel-Build zu zeigen. In meinem sieht es so aus (Ihre URL wird wahrscheinlich anders sein!):

$ curl -i localhost / l4api / public / index.php / authtest HTTP / 1.1 401 Unauthorized Date: Di, 21 May 2013 18:47:59 GMT WWW-Authenticate: Normal Vary: Akzeptieren Sie die Codierung. Inhaltstyp: text / html ; charset = UTF-8 Ungültige Anmeldeinformationen

Wie Sie sehen, wird eine nicht autorisierte Anforderung erkannt und eine Meldung "Ungültige Anmeldeinformationen" mit einem 401-Statuscode zurückgegeben. Versuchen Sie als Nächstes, die Standardauthentifizierung hinzuzufügen.

$ curl --user firstuser: erstes_kennwort localhost / l4api / public / index.php / authtest HTTP / 1.1 200 OK Datum: Di, 21 Mai 2013 18:50:51 GMT Variieren: Akzeptieren Sie die Kodierung. Inhaltstyp: text / html; Zeichensatz = UTF-8 

Hallo Welt!

Es funktionierte!

An diesem Punkt ist die Basisarbeit unserer API abgeschlossen. Wir haben:

  • Installierte Laravel 4
  • Erstellt unsere Datenbank
  • Erstellt unsere Modelle
  • Ein Authentifizierungsmodell erstellt

Funktionsanforderungen erstellen

Sie sind möglicherweise mit den RESTful-Controllern von Laravel vertraut. Sie existieren noch in Laravel 4; Wir können jedoch auch die ressourcenreichen Controller von Laravel verwenden, die einige Paradigmen aufstellen, mit denen wir eine konsistente API-Schnittstelle erstellen können. Wir verwenden einen Resourceful-Controller.

Nachfolgend finden Sie eine Auflistung der einzelnen Methoden des ressourcenreichen Controllers. Beachten Sie, dass Sie die Routen / resource / create und / resource / id / edit entfernen können, da in einer API keine Formulare zum Erstellen oder Editieren angezeigt werden müssen.

Erstellen Sie einen Resourceful Controller

$ php Handwerker-Controller: UrlController erstellen

Richten Sie als Nächstes eine Route für die Verwendung des Controllers ein und verlangen Sie, dass jede Route authentifiziert wird.

Bearbeiten app / routes.php und füge hinzu:

// Routengruppe für die API-Versionierung Route :: group (array ('prefix' => 'api / v1', 'before' => 'auth.basic')), function () Route :: resource ('url', 'UrlController'););

Dort passiert einiges.

  1. Dies wird auf Anfragen reagieren http://example.com/api/v1/url.
  2. Dadurch können wir zusätzliche Routen hinzufügen, wenn wir unsere API erweitern müssen. Wenn Sie beispielsweise einen Benutzerendpunkt hinzufügen, z / api / v1 / Benutzer.
  3. Es gibt auch einen Benennungsmechanismus für die Versionierung unserer API. Dies gibt uns die Möglichkeit, neue API-Versionen einzuführen, ohne ältere Versionen zu brechen. Wir können einfach eine erstellen v2 Gruppe weiterleiten und auf einen neuen Controller verweisen!

Hinweis: Möglicherweise möchten Sie erweiterte API-Versionierungstechniken in Betracht ziehen, z. B. die Verwendung von Akzeptieren Header oder Subdomain, die Ihnen helfen können, unterschiedliche API-Versionen auf separate Codebasis zu verweisen.

Fügen Sie die Funktionalität hinzu

Bearbeiten Sie das Neue app / controller / UrlController.php Datei:

// Bearbeiten Sie dies: public function index () return 'Hello, API'; 

Lass es uns testen:

$ curl -i localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 401 Unauthorized Date: Di, 21 May 2013 19:02:59 GMT WWW-Authentifizierung: Grundlegend: Akzeptieren Sie den Inhaltstyp "Encoding" : text / html; charset = UTF-8 Ungültige Anmeldeinformationen. $ curl --user firstuser: erstes_kennwort localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 200 OK Datum: Di, 21 Mai 2013 19:04:19 GMT Vary: Akzeptieren der Codierung Inhaltstyp: Text / HTML; charset = UTF-8 Hallo, API

Wir verfügen jetzt über einen einfallsreichen Controller mit funktionierender Authentifizierung und können jetzt weitere Funktionen hinzufügen.

URL erstellen

Bearbeiten app / controller / UrlController.php:

/ ** * Speichern Sie eine neu erstellte Ressource im Speicher. * * @return Response * / public function store () $ url = neue URL; $ url-> url = Request :: get ('url'); $ url-> description = Request :: get ('description'); $ url-> user_id = Auth :: user () -> id; // Validierung und Filterung wird dringend benötigt !! // Im Ernst, ich bin ein schlechter Mensch, weil ich das ausgelassen habe. $ url-> save (); Antwort zurückgeben :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200); 

Es ist Zeit, dies mit einer anderen Curl-Anfrage zu testen. Dieser sendet eine POST-Anfrage, die der entspricht Geschäft() oben erstellte Methode.

$ curl -i --user firstuser: erstes_kennwort -d 'url = http: //google.com&description=A Suchmaschine' localhost / l4api / public / index.php / api / v1 / url HTTP / 1.1 201 Erstellungsdatum: Di , 21 Mai 2013 19:10:52 GMT Content-Type: application / json "error": false, "message": "URL wurde erstellt"

Cool! Lassen Sie uns ein paar weitere für unsere beiden Benutzer erstellen.

$ curl --user firstuser: erstes_kennwort -d 'url = http: //fideloper.com&description=A Great Blog' localhost / l4api / public / index.php / api / vi / url $ curl --user zweiter Benutzer: second_password -d 'url = http: //digitalsurgeons.com&description=A Marketing Agency' localhost / l4api / public / index.php / api / v1 / url $ curl --user seconduser: second_password -d 'url = http: //www.poppstrong .com / & description = Ich fühle für ihn 'localhost / l4api / public / index.php / api / v1 / url

Als Nächstes erstellen wir Methoden zum Abrufen von URLs.

/ ** * Zeigt eine Auflistung der Ressource an. * * @return Response * / public function index () // Früher: return 'Hallo, API'; $ urls = URL :: where ('user_id', Auth :: user () -> id) -> get (); Antwort zurückgeben :: json (array ('error' => false, 'urls' => $ urls-> toArray ()), 200);  / ** * Zeigt die angegebene Ressource an. * * @param int $ id * @return Response * / public function show ($ id) // Vergewissern Sie sich, dass der aktuelle Benutzer die angeforderte Ressource besitzt. $ url = Url :: where ('user_id', Auth :: user () - > id) -> wo ('id', $ id) -> take (1) -> get (); Antwort zurückgeben :: json (array ('error' => false, 'urls' => $ url-> toArray ()), 200); 

Lass uns sie testen:

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

Fast fertig. Lassen Sie uns nun Benutzern erlauben, eine URL zu löschen.

/ ** * Entfernen Sie die angegebene Ressource aus dem Speicher. * * @param int $ id * @return Response * / public-Funktion destroy ($ id) $ url = URL :: where ('user_id', Auth :: user () -> id) -> find ($ id) ; $ url-> delete (); Antwort zurückgeben :: json (array ('error' => false, 'message' => 'url gelöscht'), 200); 

Jetzt können wir eine URL mit einer DELETE-Anfrage löschen:

$ curl -i -X ​​DELETE --user firstuser: erstes_kennwort localhost / l4api / public / index.php / api / v1 / url / 1 HTTP / 1.1 200 OK Datum: Di, 21 Mai 2013 19:24:19 GMT Inhalt- Geben Sie Folgendes ein: application / json "error": false, "message": "URL gelöscht"

Schließlich erlauben wir Benutzern, eine URL zu aktualisieren.

/ ** * Aktualisieren Sie die angegebene Ressource im Speicher. * * @param int $ id * @return Response * / Aktualisierung der öffentlichen Funktion ($ 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 (); Antwort zurückgeben :: json (array ('error' => false, 'message' => 'URL aktualisiert'), 200); 

Führen Sie zum Testen von URL-Aktualisierungen Folgendes aus:

$ curl -i -X ​​PUT --user seconduser: second_password -d 'url = http: //yahoo.com' localhost / l4api / public / index.php / api / vi / vl / url / 4 HTTP / 1.1 200 OK Datum: Di, 21 May 2013 19:34:21 GMT Content-Type: application / json "error": false, "message": "URL aktualisiert" // Änderungen anzeigen $ 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 fühlen Sie sich für ihn "," id ":" 3 "," updated_at ":" 2013-02-02 18:44:18 "," url ":" http://yahoo.com "," user_id ":" 1 "]

Und das ist es

Wir haben jetzt den Anfang einer voll funktionsfähigen API. Ich hoffe, Sie haben viel darüber gelernt, wie Sie mit Laravel 4 eine API in Gang bringen.

Zusammenfassend haben wir in dieser Lektion Folgendes erreicht:

  1. Installieren Sie Laravel
  2. Erstellen Sie die Datenbank mithilfe von Migrationen und Seeding
  3. Verwenden Sie eloquent ORM-Modelle
  4. Authentifizieren Sie sich mit Basic Auth
  5. Richten Sie Routen ein, einschließlich der Versionierung der API
  6. Erstellen Sie die API-Funktionalität mithilfe von Resourceful Controllers

Die nächsten Schritte

Wenn Sie Ihre API noch weiter verbessern möchten, können Sie Folgendes als nächsten Schritt betrachten.

  1. Validierung (Hinweis: Laravel verfügt über eine Validierungsbibliothek).
  2. Fehlerbehandlung bei API-Anforderungen - Es ist immer noch möglich, HTML-Antworten auf API-Anforderungen zu erhalten (Hinweis: Fehlerbehandlung bei Laravel-Fehlern plus Inhaltsverhandlung).
  3. Content Negotiation - Auf den Accept-Header achten. (Hinweis: Die Anfrageklasse von Laravel gibt Ihnen die Anforderungsheader.).
  4. Schauen Sie sich die API-Craft-Google-Gruppe an.
  5. Erfahren Sie mehr über die verschiedenen Arten von Zwischenspeicherungen und wie die Gültigkeitsprüfung Ihre API verbessern kann.
  6. Testen Sie Ihren Code.
  7. Schauen Sie sich Apigees großartige API-Ressourcen an.
  8. Probieren Sie einige der nützlichen Laravel-Skripte und Plugins aus, die auf dem Envato Market erhältlich sind.