Eine der neuesten (eine Art) Crazes Fegen des Netto-APIs ist, genauer gesagt diejenigen, so dass optimal auf REST. Es ist wirklich keine Überraschung, entweder, wie aufwändig REST-APIs ist so unglaublich einfach ... in jeder Sprache. Es ist auch unglaublich einfach zu erstellen, wie Sie sie verwenden im Wesentlichen nichts anderes als ein HTTP-Spezifikation, die seit Urzeiten existiert. Eines der wenigen Dinge, die ich geben Rails Kredit für ist die durchdachte REST-Unterstützung, sowohl für die Bereitstellung und konsumieren diese APIs (wie sein von all den Rails Fanboys mit denen ich arbeite erklärt worden).
Ernsthaft, wenn Sie noch nie REST verwendet, aber du hast schon einmal mit (oder noch schlimmer, zu erstellen) eine SOAP-API arbeiten, oder einfach eröffnete eine WSDL und hatte den Kopf explodieren, Junge habe ich gute Nachrichten für Sie!
Also, was auf der Erde ist REST? Warum sollten Sie darauf?
Bevor wir in das Schreiben von etwas Code zu erhalten, möchte ich sicherstellen, dass jeder in sich hat ein gutes Verständnis davon, was REST ist und wie sein großes für APIs. Erstens, technisch gesprochen, REST nicht spezifisch für nur APIs, es ist eher ein Gattungsbegriff. Jedoch offensichtlich, im Interesse von diesem Artikel werden wir darüber reden im Zusammenhang mit einer API. Also, lasst uns auf die grundlegenden Bedürfnisse einer API und wie REST spricht sie aussehen.
Anfragen
Alle APIs müssen Anforderungen zu akzeptieren. In der Regel mit einer REST-API, haben Sie eine gut definierte URL-Schema. Angenommen, Sie möchten eine API für die Nutzer auf Ihrer Website (ich weiß, ich benutze immer die "Benutzer"-Konzept für meine Beispiele) bieten. Nun, Ihre URL-Struktur würde wahrscheinlich so etwas wie sein ", api / users" und "api / users / [id]" in Abhängigkeit von der Art der Operation, die gegen Ihre API angefordert. Sie müssen auch überlegen, wie Sie Daten annehmen möchten. In diesen Tagen viele Menschen sind mit JSON oder XML und JSON Ich persönlich bevorzuge, weil es gut funktioniert mit JavaScript, PHP und bietet eine gute Funktionalität für Codierung und Decodierung es. Wenn Sie Ihr API wollte wirklich robust, könnten Sie beide durch Schnüffeln aus dem Content-Typ der Anfrage (dh application / json oder application / xml) zu akzeptieren, aber es ist durchaus akzeptabel, die Dinge auf eine Art des Inhalts zu beschränken. Heck, könnten Sie sogar verwenden einfache Schlüssel / Wert-Paare, wenn man wollte.
Das andere Stück eines Ersuchens ist es, was es eigentlich bedeutete, zu tun, wie Laden, Speichern, etc. Normalerweise müssten Sie kommen mit irgendeiner Art von Architektur, welche Maßnahmen der Antragsteller (Verbraucher-) Wünsche definiert, aber REST vereinfacht dass. Durch die Verwendung von HTTP-Request-Methoden, oder Verben, brauchen wir nicht, irgendetwas zu definieren. Wir können einfach die GET, POST, PUT und DELETE-Methoden, und das deckt jeden Wunsch würden wir brauchen. Sie können die Verben zu Ihrem Standard CRUD-Stil Zeug gleichsetzen: GET = Last / abrufen, POST = anlegen, setzen = UPDATE, DELETE = gut, zu löschen. Es ist wichtig zu beachten, dass diese Verben nicht direkt an CRUD übersetzen, aber es ist ein guter Weg, um über sie denken. Also, geht zurück zu den oben genannten URL-Beispiele, lassen Sie uns einen Blick an, was einige mögliche Zugriffe könnte bedeuten:
- GET-Request an / api / users - Liste aller Benutzer
- GET-Request an / api/users/1 - List info für Benutzer mit der ID von 1
- POST-Request an / api / users - Erstellen eines neuen Benutzerkontos
- PUT-Request an / api/users/1 - Update Benutzer mit der ID von 1
- DELETE Anfrage an / api/users/1 - Löschen Benutzer mit der ID von 1
Wie Sie sehen, hoffentlich hat REST schon viel Sorgfalt eines der größten Kopfschmerzen der Erstellung Ihrer eigenen API durch einige einfache, gut verstandenen Standards und Protokolle genommen, aber es gibt ein weiteres Stück zu einem guten API ...
Antworten
So handhabt REST-Anfragen sehr leicht, aber es macht auch Generieren von Antworten einfach. Ähnliche Anfragen gibt es zwei Hauptkomponenten eines REST-Antwort: die Antwort Körper, und eine Status-Code. Der Hauptteil der Antwort ist recht einfach zu behandeln. Wie die Anfragen, sind die meisten Reaktionen in der Regel entweder REST JSON oder XML (vielleicht nur Klartext in Bezug auf Planstellen, aber wir werden das später zu decken). Und, wie Anfragen, kann der Verbraucher angeben, die Antwort geben sie gerne durch einen anderen Teil des HTTP-Request-spec, "Accept" würde. Will ein Verbraucher eine XML-Antwort zu erhalten, würden sie senden eine Accept-Header als Teil ihrer Anfrage sagt so viel ("Accept: application / xml"). Zugegebenermaßen ist dieses Verfahren nicht als weithin angenommen (tho es sein sollte), so haben Sie können auch das Konzept einer Erweiterung in der URL. Zum Beispiel / api / users.xml bedeutet, dass der Verbraucher will XML als Antwort, ähnlich / api / users.json heißt JSON (gleiches gilt für Dinge wie / api/users/1.json/xml). Wie auch immer Sie wählen (ich sage beides tun), sollten Sie eine Standard-Antwort-Typ als ein großer Teil der Zeit Menschen gewohnt auch sagen, was sie wollen, zu pflücken. Auch hier würde ich sagen, gehen Sie mit JSON. Also, keine Accept-Header oder Verlängerung (dh / api / users) sollten nicht versäumen, es sollte nur Fail-Over auf die Standard-Antwort-Typ.
Aber was ist mit Fehlern und andere wichtige Statusmeldungen mit Anträgen verbunden? Einfach, benutzen HTTP-Status-Codes! Dies ist weit oben und einer meiner liebsten Dinge über das Erstellen von REST-APIs. Durch die Verwendung von HTTP-Status-Codes, Sie brauchen nicht zu kommen mit einem Fehler / Erfolg für Ihr Schema API, ist es schon für Sie erledigt. Zum Beispiel, wenn ein Verbraucher neu zu / api / Benutzer und Sie zu berichten, eine erfolgreiche Schaffung möchten, senden Sie einfach eine Status-Code 201 (201 = erstellt). Wenn es versäumt, schicken Sie eine 500, wenn es auf Ihrem Ende gescheitert (500 = Internal Server Error), oder vielleicht ein 400, wenn sie Mist gebaut (400 = Bad Request). Vielleicht versuchen sie, gegen eine API-Endpunkt, der nicht akzeptiert ... senden Beiträge 501 (Nicht implementiert) POST. Vielleicht ist Ihr MySQL-Server ausgefallen ist, so dass Ihre API vorübergehend borked ... senden 503 (Service nicht verfügbar). Ich hoffe, Sie wissen schon. Wenn Sie möchten, lesen Sie ein wenig auf Status-Codes, schaut sie euch auf Wikipedia: Liste der HTTP-Status-Codes .
Ich hoffe, Sie sehen, alle Vorteile erhalten Sie durch den Einsatz der Konzepte von REST-APIs für Ihre. Es ist wirklich super-cool, und es ist eine Schande sein nicht mehr weit zu der PHP-Community gesprochen (zumindest soweit ich das beurteilen kann). Ich denke, dies ist wahrscheinlich auf den Mangel an guter Dokumentation über den Umgang mit Anforderungen, die nicht GET oder POST werden, nämlich PUT und DELETE umzugehen. Zugegeben, es ist ein bisschen doof, die sich mit diesen, aber es ist sicherlich nicht schwer. Ich bin auch sicher, dass einige der beliebtesten Frameworks da draußen wahrscheinlich haben eine Art von REST-Implementierung, aber ich bin kein großer Fan Rahmen (für eine Menge von Gründen, die ich nicht in erhalten), und es ist auch gut zu wissen diese Dinge auch dann, wenn jemand bereits ist die Lösung für Sie erstellt.
Wenn Sie noch nicht überzeugt sind, dass dies eine nützliche API Paradigma ist, nehmen Sie einmal an, was REST für Ruby on Rails getan hat. Eine der wichtigsten Ansprüche auf Ruhm ist, wie einfach es APIs (durch eine Art Voodoo-RoR, ich bin sicher), und das zu Recht zu schaffen ist. Zugegeben, ich weiß sehr wenig über RoR, aber die Fanboys rund um das Büro haben diesen Punkt für mich viele Male predigte. Aber ich schweife ab ... lasst uns etwas Code schreiben!
Erste Schritte mit REST und PHP
Ein letzter Hinweis: Die Codes sind wir im Begriff zu gehen vorüber ist in keiner Weise beabsichtigt, als ein Beispiel für eine robuste Lösung eingesetzt werden. Mein Hauptziel ist es, hier zeigen, wie man mit den einzelnen Komponenten von REST in PHP verarbeiten, und lassen Sie die Erstellung des endgültigen Lösung bis zu Ihnen.
Also, lasst uns in auszugraben! Ich denke, der beste Weg, um etwas Praktisches tun ist, um eine Klasse, die alle Utility-Funktionen müssen wir eine REST-API erstellen, geben schafft. Wir werden auch eine kleine Klasse für die Speicherung unserer Daten. Sie können auch dann nehmen diese, weiterzuführen, und wenden Sie sie an Ihre eigenen Bedürfnisse. Also, lasst uns ein paar Sachen Stub-out:
Klasse RestUtils {public static function processRequest () {} public static function sendResponse ($ status = 200, $ body ='', $ content_type = 'text / html ") {} public static function getStatusCodeMessage ($ status) {/ / diese könnte in einem. ini-Datei gespeichert und geladen werden / / via parse_ini_file () ... wird dies jedoch / / für ein Beispiel-Codes $ = Array (100 => 'Weiter', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Erstellt', 202 => 'akzeptiert' genügen , 203 => 'Non-Authoritative Information', 204 => 'Kein Inhalt', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently' , 302 => 'gefunden', 303 => 'Siehe Andere', 304 => 'Seite nicht geändert', 305 => 'Proxy verwenden', 306 => '(Unused)', 307 => 'Temporary Redirect ", 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Bezahlung erforderlich', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => ' Nicht akzeptabel ', 407 =>' Proxy-Authentifizierung erforderlich ', 408 =>' Request Timeout ', 409 =>' Conflict ', 410 =>' Gone ', 411 =>' Length Required ', 412 =>' Vorbedingung nicht erfüllt " , 413 => 'Request Entity Too Large ", 414 =>' Request-URI Too Long", 415 => 'Unsupported Media Type', 416 => 'angeforderte Bereich nicht erfüllbar', 'Konnte Erwartung "417 =>, 500 => 'Internal Server Error', 501 => 'Nicht implementiert', 502 => 'Bad Gateway', 503 => 'Dienst nicht verfügbar', 504 => 'Gateway Timeout', 505 => 'HTTP-Version wird nicht unterstützt') ; return (isset ($ Codes [$ status]))? $-Codes [$ status]:'';}} Klasse RestRequest {private $ request_vars; private $ Daten; private $ HTTP_ACCEPT; private $-Methode; public function __ construct () {$ this-> request_vars = array (); $ this- > data =''; $ this-> HTTP_ACCEPT = (strpos ($ _SERVER ['HTTP_ACCEPT'], 'json'))? 'Json': 'xml', $ this-> method = "get ';} public function setData ($ data) {$ this-> data = $ data;} public function setMethod ($ method) {$ this-> Methode = $ method;} public function setRequestVars ($ request_vars) {$ this-> request_vars = $ request_vars;} public function getData () {return $ this-> data;} public function getMethod () {return $ this-> Methode; getHttpAccept} public function () {return $ this-> HTTP_ACCEPT;} public function getRequestVars () {return $ this-> request_vars;}}
OK, also, was wir haben ist eine einfache Klasse zur Speicherung von Informationen über unser Anfrage (RestRequest), und eine Klasse mit einigen statischen Funktionen, die wir verwenden, um mit Anfragen und Antworten umgehen können. Wie Sie sehen können, haben wir eigentlich nur zwei Funktionen zu schreiben ... das ist das Schöne an dieser ganzen Sache! Genau, lasst uns bewegen ...
Verarbeiten der Anforderung
Verarbeiten der Anforderung ist ziemlich geradlinig, aber das ist, wo wir in ein paar Fänge (nämlich mit PUT und DELETE ... meistens PUT) ausgeführt werden kann. Wir gehen über die in einem Moment zu gehen, aber wir prüfen RestRequest Klasse ein wenig. Wenn Sie an den Konstruktor werde schauen, werden Sie sehen, dass wir bereits Interpretation der HTTP_ACCEPT Header und säumigen zu JSON wenn keiner angegeben wird. Mit diesem aus dem Weg, wir brauchen sich nur auf die eingehenden Daten.
Es gibt ein paar Möglichkeiten, wie wir dabei vorgehen könnte, aber lasst uns einfach mal davon aus, dass wir immer einen Schlüssel / Wert-Paar in unserer Anfrage: 'data' => Ist-Daten. Nehmen wir weiterhin an, dass die eigentlichen Daten werden JSON sein. Wie in meinem vorherigen Erklärung von REST erklärte, könnten Sie bei der Content-Type des Antrags und befassen sich mit beiden JSON oder XML aussehen, aber wir halten es einfach für den Moment. So wird unser Prozess Anfrage-Funktion am Ende der Suche etwas wie dieses:
public static function processRequest () { / / Get unsere Verb $ REQUEST_METHOD = strtolower ($ _SERVER ['REQUEST_METHOD']); $ Return_obj = new RestRequest (); / / Wir werden unsere Daten hier gespeichert werden $ Data = array (); switch ($ REQUEST_METHOD) { / / Bekommt sind einfach ... Fall 'get': $ Data = $ _GET; zu brechen; / / So sind Beiträge Fall 'post': $ Data = $ _POST; zu brechen; / / Hier kommt der trickreiche ... Fall 'put': / / Im Grunde, lesen wir einen String aus spezieller Eingang der PHP-Standort, / / Und dann analysieren, es in ein Array über parse_str ... pro der PHP-Dokumentation: / / Verarbeitet str, als ob er der Query-String über eine URL übergeben wurden und setzt / / Variablen im aktuellen Gültigkeitsbereich. parse_str (file_get_contents ('php :/ / input'), $ put_vars); $ Data = $ put_vars; zu brechen; } / / Die Methode $ Return_obj-> setMethod ($ REQUEST_METHOD); / / Setzt die Rohdaten, so dass wir darauf zugreifen können, wenn nötig (es kann / / Andere Stücke auf Ihre Anfragen) $ Return_obj-> setRequestVars ($ data); if (isset ($ data ['data'])) { / / Übersetzen das JSON-Objekt zu einer für den Einsatz immer Sie wollen $ Return_obj-> setData (json_decode ($ data ['data'])); } return $ return_obj; }
Wie gesagt, ziemlich geradlinig. Um jedoch ein paar Dinge beachten ... Erstens, die Sie normalerweise nicht akzeptieren, Daten für die DELETE-Anforderungen, so dass wir nicht über einen Fall für sie in den Switch. Zweitens, werden Sie feststellen, dass wir beide den Wunsch Variablen und die analysierten JSON-Daten zu speichern. Dies ist nützlich, wie Sie andere Sachen als Teil Ihrer Anfrage (sagen wir einen API-Schlüssel oder etwas), die nicht wirklich die Daten selbst (wie ein neues Benutzer-Name, Email, etc.) haben kann.
So würde wie wir sie verwenden das? Gehen wir zurück an den Benutzer beispielsweise. Angenommen, Sie haben Ihren Antrag auf die richtige Steuerung für Benutzer geleitet werden, könnten wir etwas Code wie folgt aus:
$ Data = RestUtils :: processRequest (); switch ($ Daten-> getMethod) { Fall 'get': / / Abrufen einer Liste von Benutzern zu brechen; Fall 'post': $ User = new User (); $ User-> setFirstName ($ data-> getData () -> vorname); / / nur zum Beispiel, sollte dies getan werden sauberer / / Und so weiter ... $ User-> save (); zu brechen; / / Etc, etc, etc. .. }
Bitte tun Sie das nicht in einer realen Anwendung, ist dies nur ein quick-and-dirty Beispiel. Sie würden wollen, dies zu wickeln sich in einem schönen Kontrollstruktur mit allem, was abstrahiert richtig, aber das sollte Ihnen helfen, eine Vorstellung davon, wie man dieses Zeug zu benutzen. Aber ich schweife ab, lasst uns auf, um eine Antwort zu senden bewegen.
Senden der Antwort
Nun, da können wir den Wunsch interpretieren, lassen Sie uns auf dem Senden der Antwort zu bewegen. Wir wissen bereits, dass alles, was wir wirklich tun müssen, senden Sie den richtigen Status-Code ist, und vielleicht noch einige Körper (wenn es sich um eine GET-Anfrage waren, zum Beispiel), aber es ist ein wichtiger Fang zu Reaktionen, die keinen Körper haben. Sagen Sie jemandem einen Antrag gegen unsere Stichprobe Benutzer-API für einen Benutzer, der nicht existiert (dh api/user/123). Der entsprechende Status-Code zu schicken, ist eine 404 in diesem Fall, sondern einfach das Senden der Status-Code in den Header ist nicht genug. Wenn Sie diese Seite aufgerufen haben in Ihrem Web-Browser, bekommt man einen leeren Bildschirm. Dies liegt daran, Apache (oder was immer Ihr Webserver läuft auf) nicht sendet den Status-Code, so gibt es keine Status-Seite. Wir müssen dies berücksichtigen, wenn wir unsere Funktion zu bauen. Halten Sie alles, was im Sinn, hier ist was der Code sollte so aussehen:
public static function sendResponse ($ status = 200, $ body ='', $ content_type = 'text / html ") {$ status_header =' HTTP/1.1 '. $ Status. ''. RestUtils :: getStatusCodeMessage ($ status); / / Setzen des Status-Header ($ status_header); / / Setzen des Content-Type header ('Content-type:'. $ Content_type); / / Seiten mit Körper sind einfach if ($ Körper ! ='') {/ / Senden der Körper echo $ Körpers; exit;} / / wir brauchen, um den Körper zu schaffen, wenn keiner sonst übergeben wird {/ / erstellen einige Körper Botschaften $ message =''; / / Das ist rein optional , macht aber die Seiten ein wenig schöner zu / / für Ihre Benutzer zu lesen. Da Sie wahrscheinlich nicht senden wird eine Menge verschiedener Status-Codes, / / das auch sollte nicht zu schwerfällig, um switch ($ status) {case 401 zu erhalten: $ message = '. Sie müssen Zugriff auf diese Seite ansehen zu können'; break case 404: $ message = "Die aufgerufene URL '. $ _SERVER ['REQUEST_URI']. 'Wurde nicht gefunden.'; Break case 500: $ message = "Der Server hat einen Fehler der Bearbeitung Ihrer Anfrage." Break; Fall 501: $ message = '. Die aufgerufene Methode ist nicht implementiert'; break;} / / Server müssen nicht immer eine Signatur aktiviert (dies ist eine Apache-Direktive "ServerSignature On") $ signature = ($ _SERVER ['SERVER_SIGNATURE'] =='')? $ _SERVER ['SERVER_SOFTWARE']. 'Server an. " $ _SERVER ['SERVER_NAME']. 'Port'. $ _SERVER ['SERVER_PORT']: $ _SERVER ['SERVER_SIGNATURE']; / / Das sollte in einer realen Lösung templatized werden $ body = '<DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.01 / / EN! "" http://www.w3.org/TR/html4/strict.dtd "> <html> <head> <meta http-equiv =" Content-Type "content =" text / html; charset = ISO-8859 -1 "> <title> '. $ Status. ''. RestUtils :: getStatusCodeMessage ($ status). '</ Title> </ head> <h1>'. RestUtils :: getStatusCodeMessage ($ status). '</ H1> <p'. $ Message. '</ P> <hr /> <Adresse>'. $ Unterschrift. '</ Address> </ body> </ html>'; echo $ body; exit;}}
Das ist es! Wir haben technisch alles, was wir jetzt brauchen, um Anforderungen zu verarbeiten und senden Antworten. Lasst uns ein bisschen mehr darüber reden, warum wir brauchen, um eine Standard-Reaktion des Körpers oder einer eigenen haben. Für GET-Anfragen, dies ziemlich offensichtlich ist, müssen wir die XML / JSON-Inhalt anstatt eine Status-Seite (sofern der Wunsch war gültig) zu senden. Allerdings gibt es auch Beiträge zu bewältigen. Innerhalb von Ihren Anwendungen, wenn Sie eine neue Einheit zu schaffen, werden Sie wahrscheinlich holen das neue Unternehmen ID über so etwas wie mysql_insert_id (). Nun, wenn ein Nutzer auf Ihre Beiträge API, werden sie wahrscheinlich wollen, dass die neue ID als auch. Was werde ich in der Regel in diesem Fall zu tun ist schicken Sie einfach die neue ID wie der Körper (mit einem 201 Status-Code), aber man könnte auch verpacken, dass in XML oder JSON, wenn Sie möchten.
Also erweitern wir unser Beispiel-Implementierung ein bisschen:
switch ($ Daten-> getMethod) { / / Das ist eine Anforderung für alle Benutzer, nicht ein besonders Fall 'get': $ User_list getUserList = (); / / nehme an, dies gibt ein Array if ($ Daten-> getHttpAccept == 'json') { RestUtils :: sendResponse (200, json_encode ($ user_list), "application / json '); } else if ($ data-> getHttpAccept == 'xml') { / / Verwendung des XML_SERIALIZER Pear-Paket $ Options = array ( 'Gedankenstrich' => '', 'AddDecl' => false, 'RootName' => $ fc-> getAction (), XML_SERIALIZER_OPTION_RETURN_RESULT => true ); $ Serialisierungsprogramm = new XML_Serializer ($ options); RestUtils :: sendResponse (200, $ Serializer-> serialize ($ user_list), "application / xml '); } zu brechen; / / Neuen Benutzer zu erstellen Fall 'post': $ User = new User (); $ User-> setFirstName ($ data-> getData () -> vorname); / / nur zum Beispiel, sollte dies getan werden sauberer / / Und so weiter ... $ User-> save (); / / Senden Sie einfach die neue ID als der Körper RestUtils :: sendResponse (201, $ user-> getId ()); zu brechen; }
Auch dies ist nur ein Beispiel, aber es funktioniert zeigen (glaube ich zumindest), wie wenig Aufwand es zu implementieren REST Zeug nimmt.
Nachbereitung
So, das darüber. Ich bin ziemlich zuversichtlich, dass ich den Punkt geschlagen, dass diese sollte recht einfach in den Boden, so möchte ich mit, wie Sie diese Dinge weiter zu gehen und vielleicht ordnungsgemäß umzusetzen es zu schließen.
In einer realen MVC-Anwendung, was Sie wahrscheinlich tun möchten, ist die Einrichtung eines Controllers für Ihre API, dass Lasten einzelner API-Controllern. Zum Beispiel, unter Verwendung des obigen Sachen, würden wir unter Umständen zu einer UserRestController die vier Methoden hatte: get (), put (), Post () und delete (). Die API-Controller würde auf Antrag betrachten und bestimmen, welche Methode auf diesem Controller aufrufen. Das Verfahren würde dann mit dem utils, um die Anforderung zu verarbeiten, zu tun, was sie tun-weise Daten benötigt, verwenden Sie dann die utils, um eine Antwort zu senden.
Man könnte auch noch einen Schritt weiter als das, und abstrakte Ihre API-Controller und Datenmodelle ein bisschen mehr. Anstatt explizit die Schaffung eines Controllers für jedes Datenmodell in Ihrer Anwendung, könnte man eine gewisse Logik in Ihre API-Controller auf den ersten Blick für einen explizit definierten Controller hinzuzufügen, und wenn keiner gefunden wird, versuchen, für ein bestehendes Modell zu suchen. Zum Beispiel würde die URL "api/user/1", zuerst lösen einen Nachschlag für eine "user" Rest-Controller. Wenn keiner gefunden wird, könnte es dann für ein Modell namens "user" in Ihrer Anwendung zu suchen. Wenn einer gefunden wird, könnten Sie schreiben sich ein wenig von automatisierten Voodoo automatisch zu verarbeiten alle Anträge gegen diese Modelle.
Geht man noch weiter, könnten Sie dann eine generische "list-all"-Methode, die ähnlich dem vorigen Absatz das Beispiel funktioniert. Sagen Sie Ihre URL war "api / users". Die API-Controller konnte zunächst für ein "Benutzer" Rest-Controller überprüfen, und wenn keiner gefunden wurde, zu erkennen, dass die Nutzer pluaralized wird, depluralize es, und dann suchen Sie nach einem "User"-Modell. Wenn einer gefunden wird, legen Sie eine Liste die Liste der Benutzer und senden diese ab.
Schließlich könnten Sie Digest-Authentifizierung, um Ihre API ganz einfach hinzufügen, ebenso. Angenommen, Sie wollten nur richtig authentifizierte Benutzer zu Ihrem API zugreifen, na ja, könnten Sie einen Code wie folgt in Ihren Prozess Wunsch-Funktionalität (entlehnt aus einer bestehenden App von mir, so gibt es einige Konstanten und Variablen verwiesen, dass noch nicht in diesem Snippet definiert werfen ):
/ / Herausfinden, ob wir dem Benutzer herausfordern müssen if (empty ($ _SERVER ['PHP_AUTH_DIGEST'])) { header ('HTTP/1.1 401 Unauthorized'); header ('WWW-Authenticate: Digest realm = "".. AUTH_REALM' "".. uniqid () '", qop =" auth ", Nonce =', opak =" ".. md5 (AUTH_REALM) '"') ; / / Zeigen den Fehler abzubrechen, wenn sie getroffen sterben (RestControllerLib :: Fehler (401, true)); } / / Nun, analayze die PHP_AUTH_DIGEST var if (($ data = http_digest_parse ($ _SERVER ['PHP_AUTH_DIGEST']))! | |! $ auth_username = $ data ['username']) { / / Zeigen den Fehler wegen schlechten auth sterben (RestUtils :: sendResponse (401)); } / / Bisher ist alles gut, lasst uns nun überprüfen, die Antwort ein bisschen mehr ... $ A1 = md5 ($ data ['username'] ':' AUTH_REALM ':'.... $ Auth_pass); $ A2 = md5 ($ _SERVER ['REQUEST_METHOD'] ':'.. $ Data ['uri']); $ Gueltige_antwort = md5 ($ A1. ':' $ Data ['Nonce'].. ':' $ Data ['NC'].. ':' $ Data ['cnonce'].. ':' $ Data. ['qop'] ':' $ A2);.. / / Letzte Prüfung .. if ($ data ['Antwort']! = $ gueltige_antwort) { sterben (RestUtils :: sendResponse (401)); }
Ziemlich coole Sachen, huh? Mit ein wenig von Code und einigen cleveren Logik, können Sie eine voll funktionsfähige REST-API, um Ihre Anwendungen sehr schnell hinzuzufügen. Ich sage das nicht nur, dass das Konzept entweder Tackle, implementierte ich dieses Zeug zu einem meiner persönlichen Rahmenbedingungen in etwa einen halben Tag, und verbrachte dann ein weiterer halber Tag Zugabe von allerlei coole Magie, um sie. Wenn Sie (der Leser) daran interessiert, dass meine endgültige Umsetzung sind, schreiben Sie mir eine Notiz in den Kommentaren und ich würde es gerne mit Ihnen teilen! Auch, wenn Sie irgendwelche coolen Ideen, die Sie freigeben möchten haben, achten Sie darauf, diejenigen in den Kommentaren als auch fallen lassen ... wenn ich es genug gefällt, würde ich dich sogar Gastautor Ihren eigenen Artikel zu diesem Thema!
Bis zum nächsten Mal ...
UPDATE: Die allseits geforderte Folgemaßnahmen zu diesem Artikel wurde geschrieben: REST-Anfragen machen in PHP
