Nein, dies ist kein Artikel, der Sie dazu ermutigt, mehr zu schlafen! Wenn dies jedoch Ihre erste Neigung war, wurde der folgende Text für Sie maßgeschneidert! Es ist jedoch eine unglückliche Wahrheit, dass die Prinzipien von REST sehr komplex sind. Ganze Bücher wurden zu diesem Thema geschrieben. Ich werde nicht so anmaßend sein, davon auszugehen, dass ich ein so kompliziertes Thema in ein paar tausend Wörtern zusammenfügen kann.
Das heißt, REST ist wie einige andere Technologien, wie Git und CSS, eine Technologie, bei der ein bisschen Verständnis Sie sehr weit bringen wird. Um sich so schnell wie möglich zu bewegen, konzentriert sich dieser Artikel weniger auf die Geschichte und Philosophie von REST (sowie auf die Unterschiede zu anderen Technologien wie SOAP) und mehr auf die praktischen Aspekte. Wie können Sie die REST-Architektur heute implementieren??
Halten Sie dort fest, Partner. Bevor wir in einige Codebeispiele einsteigen können, sollten wir zuerst besprechen, worauf sich REST oder Representational State Transfer bezieht.
REST, vor über zehn Jahren von Roy Fielding in seiner Doktorarbeit definiert, bietet eine einfache Möglichkeit, Interaktionen zwischen Systemen zu organisieren, am häufigsten über HTTP und den Webbrowser. Im Nachhinein macht dieser Zusammenhalt durchaus Sinn: Roy ist auch einer der Hauptautoren von HTTP!
Lassen Sie uns kurz auf URIs eingehen. Ein URI ist im Wesentlichen ein Bezeichner für eine Ressource. Betrachten Sie das folgende Beispiel:
GET / Freunde
Wir könnten dies eine Ressource nennen. Wenn diese Route nach dem REST-Muster ausgelöst wird, sollten alle Freunde, vermutlich aus einer Datenbank, abgerufen und präsentiert werden.
Aber wie können wir eine Anfrage für nur einen Freund angeben? Wie wäre es mit:
GET / Freunde / Joe
Lesbar, nicht wahr? Dies ist eine der Schlüsselkomponenten einer RESTful-Architektur. Es erlaubt URI-Strukturen, die von Menschen und Maschinen gleichermaßen lesbar sind.
Stellen Sie sich eine Ressource als Plural vor. Kontakte, Status, Benutzer, Fotos - all dies wäre die perfekte Wahl.
Bisher haben wir Haken, um eine Sammlung zu identifizieren, sowie ein einzelnes Element innerhalb dieser Sammlung:
/ freunde / freunde / joe
Sie werden feststellen, dass diese beiden Segmente alles sind, was Sie jemals brauchen sollten! Wir können dann die Leistungsfähigkeit von HTTP nutzen, um festzulegen, wie der Server auf diese URIs reagieren soll. Lassen Sie mich erklären:
Jede HTTP-Anforderung gibt eine Methode oder ein Verb in den Headern an. Sie kennen wahrscheinlich ein paar von ihnen, wie zum Beispiel ERHALTEN
und POST
. Vielleicht ist ein Beispiel in Ordnung. Öffnen Sie Google Chrome und navigieren Sie zu http://net.tutsplus.com. Öffnen Sie anschließend die Chrome Developer Tools (über einen Rechtsklick) und zeigen Sie die Registerkarte Netzwerk an. Möglicherweise müssen Sie möglicherweise die Seite aktualisieren, um die verschiedenen abgerufenen Assets anzuzeigen. Wählen Sie das erste Element in der Liste aus und zeigen Sie die Kopfzeilen an.
"Mit den Entwicklertools von Google Chrome können Sie unter anderem die Header auf eine bestimmte Anforderung überprüfen."
Warte eine Minute; Obwohl wir es nicht angegeben haben, die Anfragemethode, ERHALTEN
, wurde automatisch eingestellt! Daraus können wir (lieber Watson) das ableiten ERHALTEN
ist das Standardverb beim Anzeigen von Webseiten.
Für einen bestimmten URI können wir auf vier verschiedene Anforderungsmethoden verweisen: ERHALTEN
, POST
, STELLEN
, und LÖSCHEN
.
GET / friends POST / friends PUT / friends LÖSCHEN / friends
Im Wesentlichen weisen diese HTTP-Verben den Server an, wie er mit den durch den URI identifizierten Daten verfahren soll. Immer noch verwirrt? Du solltest sein! Sie können diese Verben leicht entschlüsseln, indem Sie sie mit dem gebräuchlichen CRUD-Akronym oder Create-Read-Update-Delete vergleichen.
GET => READ POST => CREATE PUT => UPDATE DELETE => DELETE
Das haben wir festgestellt ERHALTEN
ist die Standardanforderungsmethode, mit der Sie aber sicherlich vertraut sind POST
auch. Haben Sie schon einmal ein HTML-Formular erstellt, das bei der Übermittlung, POST
s die Daten zu Ihrem Server? Wenn dieses Formular übermittelt wird, wird die Anforderungsmethode verwendet POST
, nicht ERHALTEN
. Um beispielsweise einer Tweets-Tabelle in Ihrer Datenbank einen neuen Status hinzuzufügen, sollte das Formular verwendet werden POST
zu / Tweets
, anstatt etwas in der Richtung von /tweets/addNewTweet.php
.
In der Tat ist es ein Totenzeichen für eine nicht-RESTful-Anwendung, nach Verben in der URI zu suchen. Die HTTP-Anforderungsmethode sollte definieren, wie der Server mit der URI interagieren soll, nicht einer Menge bedeutungsloser PHP-Dateien!
Alle folgenden Elemente stellen nicht-REST-fähige (und schlecht entworfene) URIs dar.
/tweets/addNewTweet.php /friends/deleteFriendByName.php /contacts/updateContact.php
Um mein jüngeres Selbst zu kanalisieren, yuck! Tu das nicht. Dies wirft jedoch die Frage auf: Was wäre der richtige URI, um einem Benutzer ein Formular zum Hinzufügen oder Bearbeiten einer Ressource zu präsentieren?
In diesen Situationen ist es sinnvoll, zwei weitere URIs hinzuzufügen.
GET / friends / new GET / friends / joe / bearbeiten
Der erste Weg, / freunde / neu
, sollte dem Benutzer ein Formular zum Hinzufügen eines neuen Freundes zeigen. Bei Vorlage des Formulars a POST
Anfrage sollte verwendet werden, da wir einen neuen Freund hinzufügen.
Für den zweiten, / freunde / joe / bearbeiten
, Dieses Formular sollte verwendet werden, um einen vorhandenen Datensatz in unserer Datenbank zu bearbeiten. Beim Aktualisieren einer Ressource ist eine PUT-Anforderung angebracht.
Frage mich, wie man macht
STELLEN
Anfragen aus einem HTML-Formular? Bleib dran.
Bevor wir mit einigen konkreten Codebeispielen fortfahren, sollten wir die Bedeutung der einzelnen Verben weiter verdeutlichen.
Wie bereits erwähnt, ERHALTEN
ist der HTTP
Anforderungsmethode, mit der wir alle bestens vertraut sind: das Standardverb. Eine Einschränkung oder Best Practice, wenn es darum geht ERHALTEN
fordert, dass sie immer als sicher und idempotent behandelt werden sollten. Mit anderen Worten, a ERHALTEN
Die Anforderung sollte "schreibgeschützt" sein.
Es ist wichtig zu wissen, dass Sie als Ingenieur das tun können, was Sie wollen, wenn diese Routen ausgelöst werden. Nichts hindert Sie daran, Daten auf dem Server zu ändern, wenn a ERHALTEN
Anfrage wird ausgelöst. Es ist nur eine Best Practice, davon Abstand zu nehmen.
Eine sichere Methode bezieht sich auf eine Methode, die eine Ressource niemals ändert. Der Begriff "idempotent" bezieht sich auf eine Methode, die unabhängig davon, wie oft sie angefordert wird, dasselbe Ergebnis erzielt.
ERHALTEN
,STELLEN
, undLÖSCHEN
Anforderungstypen sind idempotent - das heißt, wenn Sie die Regeln befolgen.
Die zweite Anforderungsmethode, die Sie wahrscheinlich kennen, ist POST
. Heutzutage wird dieser Typ meistens verwendet, um festzulegen, wann einer Ressource neue Daten hinzugefügt werden sollen. Wenn Sie beispielsweise einen neuen Freund hinzufügen, ist eine POST-Methode die richtige Wahl.
POST / Freunde
A STELLEN
request sollte verwendet werden, wenn Sie eine Ressource erstellen oder aktualisieren müssen. In den meisten modernen Webanwendungen ist dies jedoch möglicherweise das Ergebnis der Konventionen von Ruby on Rails, STELLEN
wird ausschließlich zum Aktualisieren einer Ressource verwendet.
Stellen wir uns vor, dass wir das Alter unseres Freundes Joe aktualisieren müssen. Bei der Aktualisierung seiner Informationen über ein Formular wäre die korrekte Anforderungsmethode die richtige, STELLEN
.
Wie du vielleicht erraten hast, LÖSCHEN
sollte verwendet werden, wenn Sie die durch einen bestimmten URI identifizierte Ressource löschen müssen.
Wenn wir nicht länger mit Susan befreundet sind, kann sie, nach den Prinzipien von REST, über eine vernichtet werden LÖSCHEN
anfordern.
LÖSCHEN / Freunde / Susan
Nach der Ausführung sollten alle mit Susan verknüpften Daten aus der Datenbank entfernt werden.
All diese Theorie ist großartig, aber letztlich ist sie nutzlos, wenn wir nicht verstehen, wie wir diese Architektur auf unsere Projekte anwenden können. Nun, es gibt einige Möglichkeiten. Im folgenden Abschnitt verwenden wir das beliebte Slim PHP-Framework, um das erforderliche Routing zu organisieren. Sie werden jedoch sicherlich feststellen, dass die meisten Frameworks heutzutage eine Form der RESTful-Integration enthalten, einschließlich Ruby on Rails und Laravel.
Um Slim zu nutzen, müssen Sie ihn zunächst über Composer installieren.
„Composer ist ein Werkzeug zum Abhängigkeitsmanagement in PHP. Es ermöglicht Ihnen, die abhängigen Bibliotheken für Ihr Projekt zu deklarieren und sie in Ihrem Projekt für Sie zu installieren.
Warten Sie, Sie kennen sich mit Composer nicht aus? Hören Sie auf, was Sie gerade tun, und erforschen Sie es. Composer ermöglicht es uns, die PHP-Community zu nutzen, indem die von einer Anwendung benötigten Pakete angegeben und installiert werden. Nie mehr das Rad neu erfinden!
Die globale Installation von Composer erfordert nur zwei Schnellbefehle.
$ curl -s https://getcomposer.org/installer | php $ sudo mv composer.phar / usr / local / bin / composer
Das ist es! Sie haben jetzt Zugriff auf die Komponist
Befehl.
Im nächsten Schritt geben Sie Slim als erforderliches Paket für Ihre App an. Dies kann über a erreicht werden composer.json-Datei
in der Wurzel Ihres Projekts.
"erfordern": "schlank / schlank": "2. *"
Mit dieser Anforderung müssen wir nur laufen Komponist installieren
um die notwendigen Abhängigkeiten herunterzuladen. Einfach!
Dank ein paar Zeilen Code - und der PHP-Community - haben wir jetzt eine elegante Möglichkeit, Routen zu registrieren. Hier ist ein einfaches Beispiel, das Sie innerhalb platzieren können index.php
.
get ('/ friends', function () echo 'Alle Freunde abrufen';); $ app-> run ();
Denken Sie daran: Alle Funktionen sind kostenlos!
„Slim ist ein PHP-Mikro-Framework, mit dem Sie einfache, aber leistungsstarke Webanwendungen und APIs schnell erstellen können.
Lassen Sie uns nun die notwendigen Ressourcenwege einrichten. Wir entscheiden uns für einfach Echo
Anweisungen, die beschreiben, welche Art von Aktion in einer realen Anwendung ausgeführt werden soll.
get ('/ friends', function () echo 'Alle Freunde abrufen';); $ app-> get ('/ friends / new', function () echo 'Formular anzeigen, um einen neuen Freund hinzuzufügen'; // Das Formular sollte an / friends posten); $ app-> get ('/ friends /: friend'), Funktion ($ friend) echo 'Zeige einzelnen Freund:'. $ friend;); $ app-> get ('/ friends /: friend / edit', Funktion ($ friend) echo 'Formular anzeigen, um den Freund zu bearbeiten' // Das Formular sollte sich in / friends / $ friend befinden); $ app ->; post ('/ friends', function () echo 'Neuen Freund hinzufügen';); $ app ->; put ('/ friends /: friend', Funktion ($ friend) echo 'Update friend';); $ app ->; delete ('/ friends /: friend', Funktion ($ friend) echo 'Freund löschen';); $ app ->; run ();
Wenn Sie Slim verwenden, können Sie die Anforderungsmethode angeben, auf die Sie antworten möchten $ app-> VERB
. Um den Freund, Joe, zu löschen, würden wir auf einen warten löschen
Anfrage zu / freunde / joe
, wie so:
$ app-> delete ('/ friends /: friend', Funktion ($ friend) echo 'Freund zerstören';);
Wenn Sie wie ich sind, könnte sich Ihr nächster Gedanke darauf beziehen, wie Sie testen sollen STELLEN
und LÖSCHEN
Methoden. Wie Sie vielleicht wissen, bieten die meisten Browser nur Unterstützung für ERHALTEN
und POST
. Die Verwendung der beiden anderen Anforderungsmethoden erfordert einige Tricks, die wir in Kürze überprüfen werden.
Bis dahin ist die benutzerfreundlichste Methode, benutzerdefinierte Anforderungen zu stellen, eine Google Chrome-Erweiterung mit dem Namen Advanced Rest Client. Nach der Installation können Sie auf einfache Weise sowohl einen URI als auch die gewünschte Anforderungsmethode angeben.
„Die Advanced REST Client-Erweiterungen bieten einen einfachen Mechanismus zum Testen von URIs.
Wenn Sie mit der Befehlszeile vertraut sind, sollten Sie stattdessen die Möglichkeiten von cURL nutzen, um diese Routen zu testen.
curl localhost: 8888 / friends -X ERHALTEN
das X
Mit flag können Sie die Anforderungsmethode angeben, die verwendet werden soll. Bitte beachten Sie, dass wir im vorherigen Snippet explizit sind. das X
flag ist nicht notwendig für ERHALTEN
Anfragen, da sie die Standardeinstellung sind.
Hier ein Beispiel zum Testen einiger Routen. Denken Sie daran, dass wir einfach verwenden Echo
Anweisungen, um die Aktion zu beschreiben, die stattfinden soll.
$ curl localhost: 8888 / friends -X GET Holen Sie sich alle Freunde $ curl localhost: 8888 / friends -X POST -d 'name = Jane & age = 30' Neuen Freund hinzufügen $ curl localhost: 8888 / friends / jane -X PUT -d 'name = Jane & age = 28' Freund aktualisieren, Jane $ curl localhost: 8888 / friends / jane -X DELETE Wir sehen uns, Jane
Das Ändern von Daten auf dem Server erfordert sicherlich die neuen Daten (die wahrscheinlich aus einem Formular stammen). Bei Verwendung von cURL können Schlüssel-Wert-Paare angegeben werden -d
Flagge wie folgt:
$ curl localhost: 8888 / friends -X POST -d 'name = Jane & Alter = 30'
Dieser Befehl kann in drei Teile unterteilt werden:
Mit Ihrer serverseitigen Sprache (in unserem Fall PHP) können Sie diese dann abrufen POST
Daten auf die gleiche Weise, wie Sie normalerweise:
$ app-> post ('/ friends', function () $ name = $ _POST ['name']; // Jane $ age = (int) $ _POST ['age']; // 30 // Nun, Aktualisieren Sie die Datenbank);
Okay, wir verstehen es, eine Anforderungsmethode über die Befehlszeile anzugeben, aber wie können wir dasselbe von einem HTML-Formular aus tun? Leider können wir uns nicht darauf verlassen:
Beachten Sie, dass die Anforderungsmethode technisch immer noch auf festgelegt ist POST
. Hinter den Kulissen liest Slim jedoch den Wert der ausgeblendeten Eingabe und fährt entsprechend fort, je nachdem, welches Verb angegeben ist.
Sie werden sicherlich feststellen, dass die meisten Frameworks einem ähnlichen Muster zum Angeben von Anforderungstypen folgen.
In diesem Abschnitt haben wir nur die Implementierung eines einfallsreichen Routings in einem Framework überprüft. Wie Sie jedoch feststellen werden, ist heutzutage in den meisten Frameworks dasselbe möglich. Wenn Sie beispielsweise ein Laravel-Kunsthandwerker sind, können Sie (ab Version 4) die folgende Syntax verwenden:
Route :: Ressource ("Freunde", "FriendsController");
Diese praktische Ressourcenmethode legt fest, dass wir die erforderlichen Routen für a generieren möchten Freunde
Ressource und machen FriendsController
verantwortlich für die Handhabung der Logik für jede dieser Routen.
Wenn Sie ein Framework deaktivieren möchten, können Sie diese Funktionalität dennoch selbst implementieren. Leider ist es nicht möglich, das erforderliche Routing-System von Grund auf neu zu schreiben, doch hier ein paar Tipps, um den Einstieg zu erleichtern.
Zunächst die wichtigste Frage: Wie bestimmen wir, welches Verb für eine bestimmte Anfrage ist? Wenn Sie mitarbeiten, erstellen Sie eine neue PHP-Datei und fügen Sie Folgendes hinzu:
Wenn Sie diese Seite im Browser ausführen, sollte die Ausgabe erfolgen
ERHALTEN
. Ausgezeichnet! Jetzt haben wir die notwendigen Mittel, um die Anforderungsmethode zu erkennen und je nach Bedarf fortzufahren.Das folgende Snippet ist eindeutig elementar und erfordert eine bessere Struktur für Ihre Projekte. Es kann jedoch als Ausgangspunkt verwendet werden.
# Welche Anfragemethode? $ verb = $ _SERVER ['REQUEST_METHOD']; // GET # Wie lautet der URI? $ uri = substr ($ _ SERVER ['REQUEST_URI'], 1); // friends / joe # Erstellen Sie ein Array der Segmente $ segment = explode ('/', $ uri); // ['friends', 'joe'] # Bestimmen Sie den Controller-Namen $ controller = $ segmente [0]; // friends // Fahren Sie nach Bedarf fort, basierend auf dem Anfragetyp switch ($ verb) case 'GET': case 'POST': case 'PUT': case 'DELETE':
Testen
Es gibt eine Vielzahl von Paketen, die das Schreiben von Integrationstests so einfach wie möglich machen. Halten wir es jedoch einfach und verwenden Sie die eingebaute cURL-Bibliothek von PHP (
Libcurl
), um einige dieser Routen zu testen.Der erste Schritt wäre, cURL zu initialisieren und den gewünschten URI anzugeben. In unserem Fall testen wir das weiter
Freunde
Ressource.# Init curl und geben Sie den URI an $ ch = curl_init ('localhost: 8888 / friends');Weiter, es sei denn, wir testen den Standard
ERHALTEN
Anforderungsmethode, müssen wir den Anfragetyp angeben.# Geben Sie das HTTP-Verb an (wir ignorieren jetzt die Daten) curl_setopt ($ ch, CURLOPT_CUSTOMREQUEST, 'POST');Standardmäßig wird diese Ausgabe sofort ausgegeben. Um stattdessen die Ausgabe an eine Variable zurückzugeben, anstatt sie direkt anzuzeigen, können wir die
CURLOPT_RETURNTRANSFER
Rahmen.// Die Ausgabe zurückgeben, anstatt sie direkt anzuzeigen. Curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true);Das sollte es tun! Wir müssen nur die Anfrage ausführen und die Ergebnisse abrufen.
$ response = curl_exec ($ ch); // Neuen Freund hinzufügen $ statusCode = curl_getinfo ($ ch) ['http_code']; // 200PHPUnit
Lassen Sie uns dies zu einem PHPUnit-Test hinzufügen - um es aus Gründen der besseren Lesbarkeit relativ einfach zu halten. Wir werden einfach sicherstellen, dass jede Route die richtige zurückgibt
200
Statuscode, um anzuzeigen, dass die Anforderung erfolgreich abgeschlossen wurde. Um es auszutrocknen, abstrahieren wir die cURL-Funktionalität auf ihre eigene Methode,anfordern()
.Anfrage ("Freunde", "GET"); $ this-> assertEquals ('200', $ request-> statusCode); public function testUpdateFriend () $ request = $ this-> request ('friends / frank', 'PUT'); $ this-> assertEquals ('200', $ request-> statusCode); geschützte Funktionsanforderung ($ url, $ verb = 'GET') $ ch = curl_init ($ this-> baseUrl. $ url); curl_setopt ($ ch, CURLOPT_CUSTOMREQUEST, $ verb); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true); $ response = new stdClass; $ response-> data = curl_exec ($ ch); $ response-> statusCode = curl_getinfo ($ ch) ['http_code']; $ Antwort zurückgeben;Gehen Sie davon aus, dass Sie PHPUnit installiert haben
FreundeTest.php
. Bei Erfolg sollten Sie grün sehen! Fühlen Sie sich frei für einen privaten Siegestanz.Um einen Schritt weiter zu gehen, ist es sinnvoll, das zu abstrahieren
anfordern
Methode zu einer Basisklasse heraus, die Ihre Tests dann erweitern können. Oder, noch besser, lassen Sie ein hoch getestetes (und funktionales) Werkzeug von Drittanbietern die Arbeit erledigen. Sie können Goutte in Betracht ziehen, das über Composer installiert werden kann."required": "slim / slim": "2. *", "fabpot / goutte": "1.0.*@dev"Einmal installiert (
Komponist installieren
), können wir die manuelle cURL-Implementierung von früher ignorieren und stattdessen die Reiniger-API von Goutte verwenden, wie unten gezeigt:Client = neuer Client; public function testFriendsCollection () $ this-> client-> request ('GET', 'http: // localhost: 8888 / friends'); $ response = $ this-> client-> getResponse (); $ this-> assertEquals ('200', $ response-> getStatus ()); public function testAddFriend () $ this-> client-> request ('POST', 'http: // localhost: 8888 / friends'), []); $ response = $ this-> client-> getResponse (); $ this-> assertEquals (200, $ response-> getStatus ());Sie wären nicht die erste Person, die solche Tests für überflüssig hält; Ich versichere Ihnen jedoch, dass, sobald einer dieser Tests fehlschlägt, Sie von einem dummen Fehler befreit werden, Sie sofort ihre Nützlichkeit erkennen werden.
Weiter lernen
Um Ihre Ausbildung fortzusetzen, wird der beste Leitfaden zum Erlernen von REST von den Leuten bei Apigee zur Verfügung gestellt. Ihr Vortrag „Teach a Dog to Rest“ bringt eine Menge Wissen in nur zwanzig Minuten zusammen. Dies ist für alle Anfänger erforderlich.
„Apigee bietet eine der benutzerfreundlichsten Einführungen in REST im Web.
Danke fürs Lesen!