Arbeiten mit RESTful Services in CodeIgniter

CodeIgniter ist als PHP-basiertes Webanwendungs-Framework bekannt, aber es ist nicht oft so, dass es Beispiele dafür gibt, die für alles andere verwendet werden. Heute lernen wir, wie wir CodeIgniter verwenden können, um eine RESTful-API für Ihre vorhandenen Webanwendungen zu erstellen, und zeigen, wie Sie mit Ihrer eigenen API oder anderen RESTful-Web-Services wie Facebook und Twitter interagieren.

Wie Sie vielleicht wissen, finden Sie auf Envato Market eine große Auswahl an CodeIgniter-Skripts und -Apps, von Mitgliedschafts-Skripts über Menü-Manager und vieles mehr.

Tutorial-Details

  • Programm: CodeIgniter, CodeIgniter REST-Server und CodeIgniter-REST-Client
  • Schwierigkeit: Mittel
  • Geschätzte Fertigstellungszeit: 30 Minuten

Einführung

Wenn Sie das verfolgt haben CodeIgniter Von Grund auf Sie wissen inzwischen, dass es relativ schnell und einfach ist, einfache Webanwendungen wie Blogs, CMS-Systeme, Broschüren-Sites usw. zusammenzustellen. Eine Sache, an die Sie möglicherweise nicht gedacht haben, ist die Verwendung einer interaktiven API mit CodeIgniter. Nachdem ich mehrere vorhandene REST-Implementierungen ausprobiert hatte, stellte sich heraus, dass sie nicht nur an Einfachheit fehlten, sondern dass ihnen die meisten Funktionen fehlten, die Sie von einer REST-fähigen Implementierung erwarten würden. also baute ich meine eigene. In diesem Lernprogramm erfahren Sie, wie Sie diesen Code verwenden, um Ihre REST-API einzurichten, und Sie erhalten ein Beispiel für die Interaktion mit der Webanwendung.

Annahmen

  1. Sie haben einen Webserver, lokal oder online, eingerichtet und wissen, wie Dateien darauf verwaltet werden.
  2. Sie haben einige der CodeIgniter aus den Scratch-Tutorials gelesen.
  3. Sie wissen, wie Sie CodeIgniter einrichten.
  4. Sie wissen ein wenig über RESTful-Services.

Dieses Tutorial besteht aus zwei Teilen. Zunächst lernen wir, wie man einen REST-fähigen Dienst erstellt. Anschließend lernen wir auf verschiedene Weise mit ihm zu interagieren.

Teil 1 - Erstellen einer RESTful-API

Schritt 1: Demo einrichten

Zunächst müssen Sie den Codeigniter-Restserver-Code von GitHub herunterladen, extrahieren und den Code auf Ihren Server verschieben.

Wenn Sie den Ordner öffnen, wird eine vollständige CodeIgniter-Installation angezeigt, die für die Demo verfügbar ist. Auf diese Weise können Sie mit der REST-Demo spielen, bevor Sie sie in Ihre vorhandene Anwendung integrieren.

Aufmachen "application / config / config.php" und setze die base_url, um Links zum Laufen zu bringen. Diese base_url ist für alle unterschiedlich und hängt vollständig davon ab, wo Sie Ihre Dateien hochgeladen haben.

Schritt 2: Die URLs

Mit den extrahierten Dateien und dem base_url-Set können Sie unsere RESTful CodeIgniter-Installation laden und die mitgelieferte Demo betrachten. Durchsuchen Sie die Basis-URL, die standardmäßig lautet:

http: // localhost / restserver

Hier finden Sie ein paar Beispiellinks zum beispiel_api Controller, der unter zu finden ist "application / controller / example_api.php". Lassen Sie uns die URLs dieser Beispiele analysieren, um zu sehen, was los ist. Die erste URL ist eine sehr einfache.

Diese URL sieht sehr ähnlich aus wie jede andere CodeIgniter-URL mit einem Controller und einer Methode, aber in diesem Diagramm werden Sie feststellen, dass die Methode "Ressource" genannt wird. Bei REST handelt es sich um Ressourcen, und es handelt sich im Wesentlichen um ein Nomen in Ihrer Anwendung, mit dem basierend auf HTTP-Headern und URL-Abfragezeichenfolgen oder HTTP-Argumenten interagiert wird (d. H. Hinzugefügt, gelöscht, bearbeitet, abgefragt) wird.

Das Standardformat für die Ausgabe ist XML, wie wir es in diesem grundlegenden Beispiel sehen. Die anderen Links sind etwas größer und zeigen, wie Parameter übergeben werden und wie das Ausgabeformat in der URL geändert werden kann:

Normalerweise übergeben Sie in CodeIgniter einfach Parameterwerte, aber ein REST-Controller akzeptiert eine beliebige Anzahl von Parametern in beliebiger Reihenfolge. Damit dies funktioniert, müssen wir den Namen des Parameters gefolgt von dem Wert paarweise übergeben.

Am Ende der URL steht der Parameter "Format". Dies ist ein reservierter Parameter, der das Ausgabeformat der angeforderten Daten wie folgt ändert:

Indem sowohl dem API-Entwickler als auch der Clientanwendung die Wahl der zu verwendenden Datenformate gegeben wird, wird die API einem viel größeren Publikum zugänglich gemacht und kann mit mehr Programmiersprachen und Systemen verwendet werden. Diese drei Formate sind nicht die einzigen unterstützten Formate, die Ihre REST-API standardmäßig verwenden kann:

  • xml - Fast jede Programmiersprache kann XML lesen
  • Json - nützlich für JavaScript und zunehmend für PHP-Apps.
  • csv - Öffnen Sie mit Tabellenkalkulationsprogrammen
  • html - eine einfache HTML-Tabelle
  • php - Darstellung von PHP-Code, der eval () 'ed sein kann
  • serialisieren - Serialisierte Daten, die in PHP desialisiert werden können

Das Hinzufügen des Formats zur URL ist zwar technisch nicht die RESTful-Methode zum Ändern von Formaten, ermöglicht jedoch ein einfaches Testen des Browsers und ermöglicht Entwicklern ohne cURL, einfache GET-Anforderungen an die API auszuführen. Die RESTful-Methode ist das Senden einer Inhaltstyp HTTP-Header an den REST-Controller mithilfe von cURL, dies wird jedoch später erläutert.

Schritt 3: Der Code

Nun, wenn Sie sich öffnen application / controller / example_api.php Sie werden sofort ein paar Unterschiede zu normalen CodeIgniter-Controllern feststellen.

REST_Controller

Im MVC-Muster ist eine Steuerung der zentrale Punkt der Logik. Es wird aufgerufen, wenn ein Benutzer eine Anforderung stellt, und basierend auf der Logik in der Steuerung ruft er Daten ab und gibt Ansichten aus. CodeIgniter enthält eine eigene Logik für die Funktionsweise eines Controllers. Da wir jedoch etwas anderes tun, benötigen wir eine eigene REST_Controller-Bibliothek, die ihre eigene REST-bezogene Logik enthält. Statt einfach zu benutzen:

 

… Müssen Sie verwenden:

 

Mit Ressourcen arbeiten

Nun ist Ihr leerer Controller eingerichtet, als nächstes die Methoden oder "Ressourcen". Dies ist wahrscheinlich der verwirrendste Teil des Lernprogramms, wenn Sie mit der Funktionsweise von CodeIgniter vertraut sind. Grundsätzlich nehmen Sie die Ressource und das HTTP-Verb und kombinieren sie zu einem Methodennamen. Die zwei Beispiele, die wir uns zuvor angesehen haben, hatten also eine Ressource Nutzer und Benutzer. Da beide im Browser geladen wurden, wissen wir, dass eine GET-Anfrage verwendet wurde. Daher werden die beiden folgenden Methoden verwendet:

 

Dies mag ein wenig seltsam erscheinen, aber Sie haben die Möglichkeit, dieselbe URL zu verwenden und auf die Anforderung zu reagieren, abhängig vom verwendeten HTTP-Verb. Wenn jemand versucht, auf eine nicht erlaubte Weise auf Ihre API zuzugreifen (in diesem Beispiel PUT oder DELETE), antwortet er einfach mit einer 404-Anweisung. Wenn Sie sich nicht sicher sind, ob HTTP-Verben verwendet werden, lassen Sie mich das erklären.

ERHALTEN

Dient zum Abrufen von Informationen zu einer vorhandenen Ressource. Dies wird von Browsern verwendet, wenn Sie eine URL eingeben und auf "Los" klicken oder wenn Sie auf einen Link klicken. Dies ist perfekt, um Informationen zu einer Ihrer REST-Ressourcen abzurufen (z. B. Benutzer)..

POST

Wird verwendet, um eine vorhandene Ressource mit Informationen zu aktualisieren. Browser verwenden dies, um die meisten Arten von Formularen im Internet zu übermitteln, obwohl einige auch GET verwenden, indem sie die Formularaktion mit einer Abfragezeichenfolge übermitteln, die die Felddaten enthält.

STELLEN

Weniger häufig verwendet und von den meisten Browsern nicht unterstützt, wird PUT zum Erstellen einer neuen Ressource verwendet.

LÖSCHEN

Dieses HTTP-Verb wird auch nicht von vielen Browsern verwendet, sondern wird offensichtlich zum Löschen einer Ressource verwendet.

Wenn wir das in Code schreiben und jedes Verb auf der Ressource zulassen Nutzer es würde so aussehen:

 

Zugriff auf Parameter und Rückgabe von Daten

Nun wurde der API ihre Struktur zugewiesen, indem die Ressourcen eingerichtet und für jedes HTTP-Verb, das wir unterstützen möchten, eine Methode definiert wird. Wir benötigen Parameter, damit wir unsere CodeIgniter-Modelle und -Bibliotheken verwenden können. Dies ist einer der größten Vorteile der Verwendung von CodeIgniter für unsere API, da wir unsere vorhandenen Modelle und Bibliotheken verwenden können, ohne sie neu codieren zu müssen.

get ('id')); $ this-> response ($ data);  function user_post () $ data = array ('return:'. $ this-> post ('id')); $ this-> response ($ data);  function user_put () $ data = array ('zurückgegeben:'. $ this-> put ('id')); $ this-> response ($ data; Funktion user_delete () $ data = array ('return:'. $ this-> löschen ('id')); $ this-> response ($ data);

Dieses Beispiel enthält fünf neue Codeteile:

$ this-> get ()

Wird verwendet, um GET-Variablen entweder aus einer Abfragezeichenfolge wie dieser index.php / example_api / user? Id = 1 zurückzugeben oder kann in der mehr CodeIgniter'esque-Weise mit index.php / example_api / user / id / 1 festgelegt werden.

$ this-> post ()

Ist ein Alias ​​für $ this-> input-> post (). Dies ist die Methode von CodeIgniter für den Zugriff auf $ _POST-Variablen mit XSS-Schutz.

$ this-> put ()

Liest PUT-Argumente ein, die in den HTTP-Headern oder über cURL festgelegt sind.

$ this-> delete ()

Sie haben es erraten, liest dies in DELETE-Argumenten, die auch in HTTP-Headern oder über cURL gesetzt werden.

$ this-> antwort ()

Sendet Daten an den Browser, je nachdem, welches Datenformat angefordert wurde oder standardmäßig XML verwendet wird. Sie können optional einen HTTP-Statuscode übergeben, um anzuzeigen, dass er funktioniert hat oder fehlgeschlagen ist. Z. B. wenn die angegebene ID nicht in der Datenbank enthalten ist, könnten Sie $ this-> response (array ('error' => 'User not found.'), 404) verwenden.

Schritt 4: Arbeiten mit Ihren Modellen

Bisher haben wir in einer Neuinstallation mit einer Beispiel-API gearbeitet. Der nächste Schritt besteht darin, eine REST-API von Ihrer vorhandenen Codebase aus auszuführen.

Obwohl der Download mit einer vollständigen CodeIgniter-Installation für die Demo geliefert wird und APIs von Grund auf neu erstellt werden können, sind die beiden einzigen Dateien von Bedeutung:

  1. Anwendung / config / rest.php
  2. Anwendung / Bibliotheken / REST_Controller.php

Legen Sie diese beiden Dateien in Ihrer CodeIgniter-Anwendung ab und erstellen Sie einen neuen API-Controller.

get ('id')) $ this-> Antwort (NULL, 400);  $ user = $ this-> user_model-> get ($ this-> get ('id')); if ($ user) $ this-> Antwort ($ user, 200); // 200 ist der HTTP-Antwortcode else $ this-> response (NULL, 404);  function user_post () $ result = $ this-> user_model-> update ($ this-> post ('id'), array ('name' => $ this-> post ('name'), 'email') '=> $ this-> post (' email '))); if ($ result === FALSE) $ this-> Antwort (array ('status' => 'failed'));  else $ this-> response (array ('status' => 'success'));  function users_get () $ users = $ this-> user_model-> get_all (); if ($ Benutzer) $ this-> Antwort ($ Benutzer, 200);  else $ this-> Antwort (NULL, 404); ?>

Dies zeigt eine Beispiel-API mit einigen generischen Modellnamen. In der ersten Methode nehmen wir ein? Id = XX auf und übergeben es an das Modell. Wenn Daten gefunden werden, senden wir sie an die $ this-> response () - Funktion mit dem Status 200. Wenn nichts gefunden wird, geben Sie keinen Körper zurück und es wird ein 404 angezeigt, um nichts zu sagen. Sie können sich vorstellen, wie dies erweitert werden kann, um alle Arten von API-Aktivitäten für Ihre Webanwendung auszuführen.

Schritt 5: Sichern der API

Jetzt ist Ihre API so aufgebaut, dass sie gesichert werden muss, sodass nur Benutzer mit Zugriff mit der API interagieren können. Um den Login-Typ festzulegen, werden Benutzernamen und Passwörter geöffnet "application / config / rest.php" in Ihrer Codebasis.

/ * | ------------------------------------------- --------------------------- | REST Login | ------------------------------------------- --------------------------- | | Ist ein Login erforderlich und wenn ja, welche Art von Login? | | "= kein Login erforderlich, 'basic' = relativ sicheres Login, 'digest' = sicheres Login | * / $ config ['rest_auth'] = 'basic';

Keiner

Jeder kann mit einem Ihrer API-Controller interagieren.

Basic

Eine relativ unsichere Anmeldemethode, die nur in internen / sicheren Netzwerken verwendet werden sollte.

Verdauen

Eine wesentlich sicherere Anmeldemethode, die Benutzernamen und Kennwort verschlüsselt. Wenn Sie eine geschützte API haben möchten, die jeder nutzen kann, verwenden Sie digest.

/ * | ------------------------------------------- --------------------------- | REST Login-Benutzernamen | ------------------------------------------ ---------------------------- | | Array von Benutzernamen und Passwörtern für die Anmeldung | | array ('admin' => '1234') | * / $ config ['rest_valid_logins'] = Array ('admin' => '1234');

Das Einrichten der Benutzer ist einfach. Jedes Login ist ein Array-Element mit einem Schlüssel und einem Wert. Der Schlüssel ist der Benutzername und der Wert das Passwort. Fügen Sie diesem Array so viele hinzu, wie Sie möchten, und teilen Sie es jedem mit, der die API verwenden wird.

Teil 2 - Interaktion mit RESTful Services

Egal, ob es sich um die API handelt, die Sie gerade erstellt haben, oder um einen öffentlichen Dienst wie Twitter, Sie möchten irgendwie mit ihr interagieren können. Da RESTful-Dienste mit einfachen HTTP-Anforderungen arbeiten, ist dies auf verschiedene Weise sehr einfach möglich.

Verschiedene Methoden zur Interaktion mit REST

Jede dieser verschiedenen Interaktionsmethoden wird mit dem Code direkt in den Controller-Methoden angezeigt. Dies ist nur so, dass die Demos einfacher zu lesen sind und normalerweise in einem Modell oder einer Bibliothek untergebracht werden, um eine korrekte MVC-Trennung zu gewährleisten.

file_get_contents ()

Mit der sehr einfachen PHP-Funktion file_get_contents () können Sie eine grundlegende GET-Anforderung ausführen. Dies ist die grundlegendste aller Methoden, aber es ist erwähnenswert für "schnelle und schmutzige" Momente.

$ user = json_decode (file_get_contents ('http://example.com/index.php/api/user/id/1/format/json')); echo $ user-> name;

Beachten Sie, dass diese Methode zwar nicht mit der HTTP-Digest-Authentifizierung funktioniert, aber wenn Sie die HTTP-Standardauthentifizierung verwenden, können Sie die folgende Syntax verwenden, um Daten von Ihrer kennwortgeschützten RESTful-API abzurufen:

$ user = json_decode (file_get_contents ('http: // admin: [email protected]/index.php/api/user/id/1/format/json')); echo $ user-> name;

Bei der Verwendung dieser Methode gibt es einige Probleme: Die einzige Möglichkeit, zusätzliche HTTP-Header festzulegen, besteht darin, sie manuell mit der PHP-Funktion stream_context_create () festzulegen. Dies kann für Entwickler, die mit den internen Abläufen von HTTP-Anforderungen vertraut sind, sehr kompliziert sein. Ein weiterer Nachteil besteht darin, dass Sie den Rumpf der HTTP-Antwort nur im Rohformat erhalten, was bedeutet, dass Sie die Konvertierung von einer einzigen Anforderung aus durchführen müssen.

cURL

cURL ist die flexibelste Möglichkeit, mit einer REST-API zu interagieren, da sie genau für diese Art von Dingen entwickelt wurde. Sie können HTTP-Header, HTTP-Parameter und vieles mehr einstellen. Hier ein Beispiel, wie Sie einen Benutzer mit example_api und cURL aktualisieren, um eine POST-Anforderung zu stellen:

 Funktion native_curl ($ neuer_name, $ neue_email) $ username = 'admin'; $ password = '1234'; // Alternative JSON-Version // $ url = 'http://twitter.com/statuses/update.json'; // Einrichten und Ausführen des Curl-Prozesses $ curl_handle = curl_init (); curl_setopt ($ curl_handle, CURLOPT_URL, 'http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); curl_setopt ($ curl_handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ curl_handle, CURLOPT_POST, 1); curl_setopt ($ curl_handle, CURLOPT_POSTFIELDS, array ('name' => $ neuer_name, 'email' => $ new_email)); // Optional, löschen Sie diese Zeile, wenn Ihre API geöffnet ist. Curl_setopt ($ curl_handle, CURLOPT_USERPWD, $ username. ':'. $ Password); $ buffer = curl_exec ($ curl_handle); curl_close ($ curl_handle); $ result = json_decode ($ buffer); if (isset ($ result-> status) && $ result-> status == 'success') echo 'Benutzer wurde aktualisiert.';  else echo 'Etwas ist schief gelaufen'; 

Die Interaktion mit Ihrer API funktioniert auf diese Weise gut, es gibt jedoch zwei Probleme mit dieser Methode:

  1. Es verwendet eine hässliche verwirrende Syntax - stellen Sie sich vor, Sie erstellen mehrere Anwendungen, die darauf basieren.
  2. cURL ist standardmäßig nicht auf allen Servern installiert.

Um diese hässliche Syntax zu lösen, wurde für CodeIgniter eine cURL-Bibliothek entwickelt, die die Dinge enorm vereinfacht.

Die exakt gleiche Anforderung, die mit der cURL-Bibliothek gestellt wurde, würde folgendermaßen aussehen:

 Funktion ci_curl ($ new_name, $ new_email) $ username = 'admin'; $ password = '1234'; $ this-> load-> library ('curl'); $ this-> curl-> create ('http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); // Optional, diese Zeile löschen, wenn Ihre API geöffnet ist. $ This-> curl-> http_login ($ username, $ password); $ this-> curl-> post (array ('name' => $ neuer_name, 'email' => $ new_email)); $ result = json_decode ($ this-> curl-> execute ()); if (isset ($ result-> status) && $ result-> status == 'success') echo 'Benutzer wurde aktualisiert.';  else echo 'Etwas ist schief gelaufen'; 

Viel schöner anzusehen? Nun, es gibt eine noch einfachere Methode, mit REST in Ihren CodeIgniter-Anwendungen zu arbeiten.

REST-Client-Bibliothek

Es wurde eine REST-Clientbibliothek entwickelt, die sich auf dieser cURL-Bibliothek befindet und die Formatkonvertierung, HTTP-Anmeldungen und einige andere Aspekte Ihrer REST-API übernimmt.

 Funktion rest_client_example ($ id) $ this-> load-> library ('rest', array ('server' => 'http: //localhost/restserver/index.php/example_api/', 'http_user' => ') admin ',' http_pass '=>' 1234 ',' http_auth '=>' basic '// oder' digest ')); $ user = $ this-> rest-> get ('Benutzer', Array ('id' => $ id), 'json'); echo $ user-> name; 

Hier können Sie sehen, dass wir eine GET-Anfrage stellen, id als Parameter senden und der Bibliothek mitteilen, dass wir "json" als Inhaltsformat wünschen. Dies übernimmt die Einstellung des Content-Typs für Sie und konvertiert die Daten für Sie in ein PHP-Objekt. Sie können diesen Wert in 'xml', 'json', 'serialize', 'php', 'csv' oder einen beliebigen benutzerdefinierten MIME-Typ ändern. Beispiel:

 $ user = $ this-> rest-> get ('Benutzer', Array ('id' => $ id), 'application / json');

Wie Sie wahrscheinlich auch $ this-> rest-> get () vermutet haben, unterstützt die Bibliothek auch $ this-> rest-> post (), $ this-> rest-> put (), $ this-> rest -> delete (), um alle Ihre REST_Controller-Methoden abzugleichen.

Sie müssen var_dump () - Ergebnisse aus der REST-Clientbibliothek erhalten, um sicherzustellen, dass Sie das richtige Datenformat zurückerhalten. Die Konvertierung ist manchmal ein Array und manchmal ein Objekt, abhängig davon, wie sie von PHP konvertiert wird. Wenn der zurückgegebene MIME-Typ nicht unterstützt wird, wird das Format einfach als Nur-Text zurückgegeben.

Mit Twitter reden

Mit dieser REST-Bibliothek können Sie mit anderen RESTful-Diensten wie Twitter und Facebook sprechen. Im Folgenden finden Sie ein einfaches Beispiel, wie Sie anhand der ID eines Benutzers anhand des Standardformats von Twitter Informationen zu bestimmten Benutzern abrufen können.

 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/')); $ user = $ this-> rest-> get ('users / show', array ('screen_name' => 'philsturgeon'));
 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/', 'http_user' => 'username', 'http_pass' => 'password', ' http_auth '=>' basic ')); $ user = $ this-> rest-> post ('statuses / update.json', array ('status' => 'Den REST-Client verwenden, um Sachen zu erledigen'));

Wenn Sie dies betrachten, werden Sie feststellen, dass die Interaktion mit der Twitter-API in einigen Punkten etwas anders ist.

  1. Sie unterstützen das Umschalten auf URL-Basis in Form von .json anstelle von / format / json. Einige erfordern eine Erweiterung, andere nicht; Daher ist es am besten, sie immer hinzuzufügen.
  2. Sie unterstützen meistens nur GET / POST, beginnen jedoch mit dem Hinzufügen weiterer DELETE-Methoden
  3. Sie haben nicht immer nur eine Ressource in ihrer URL, zum Beispiel: Benutzer / Suche ist eine REST-Methode, aber Listen ist ein anderer.

Halten Sie ein Auge auf diese Unterschiede, da sie Sie erwischen können. Wenn Sie nicht weiterkommen, geben Sie einfach $ this-> rest-> debug () für eine ganze Reihe von Informationen zu Ihrer REST-Anfrage ein.

Zusammenfassung

Durch die Kombination der Informationen, die Sie jetzt über RESTful-Dienste, die CodeIgniter-REST-Clientbibliothek und die Dokumentation zur Twitter-API (oder andere RESTful-API-Dokumentation) wissen, können Sie einige sehr leistungsfähige Anwendungen erstellen, die mithilfe von REST in jeden benutzerdefinierten oder öffentlichen Webdienst integriert werden. Sie können Ihre API erweitern, indem Sie weitere REST_Controller erstellen und sogar eine modulare API erstellen, indem Sie Matchbox oder Modular Separation verwenden, um einen api.php-Controller für jedes Modul zu erstellen, um die API so sauber wie Ihre Anwendung zu organisieren.

Folgen Sie uns auf Twitter oder abonnieren Sie den Nettuts + RSS-Feed für die besten Webentwicklungs-Tutorials im Web. Vergessen Sie nicht, die nützlichen CodeIgniter-Skripts und Apps auf Envato Market zu testen.