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.
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?
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'),
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:
Wir werden die Migrationen von Laravel verwenden, um die Datenbank zu erstellen und aufzufüllen.
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' => ",),),
$ 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.
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');
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
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 unsereauth.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 AnmeldeinformationenWie 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-8Hallo Welt!
Es funktionierte!
An diesem Punkt ist die Basisarbeit unserer API abgeschlossen. Wir haben:
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.
$ 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.
http://example.com/api/v1/url
./ api / v1 / Benutzer
.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.
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.
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 "]
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:
Wenn Sie Ihre API noch weiter verbessern möchten, können Sie Folgendes als nächsten Schritt betrachten.