Programmieren mit Yii2 Erstellen einer RESTful-API

Was Sie erstellen werden

In diesem Programmierung mit der Yii2-Serie, Ich unterstütze die Leser beim Einsatz des Yii2-Frameworks für PHP. Sie könnten auch an meinem interessiert sein Einführung in das Yii-Framework, Hier werden die Vorteile von Yii erläutert und eine Übersicht über die Neuerungen in Yii 2.x gegeben.

Im heutigen Tutorial werde ich prüfen, wie Sie in Yii eine REST-API erstellen, um Ihre Anwendung mit der Cloud, mobilen Apps und anderen Diensten zu verbinden. Ich führe Sie durch Yiis REST API-Kurzanleitung und gebe Kontext und Beispiele für häufige Anfragen.

Erste Schritte mit Yii REST-APIs

Das Erstellen von REST-APIs in Yii ist relativ einfach. Sie können das vorhandene MVC-Framework nutzen, aber Sie erstellen einen eigenen Zugangspunkt, auf den verschiedene Arten von Diensten (nicht Website-Besucher) zugreifen möchten..

Die Vorteile des Yii REST-Frameworks

Das Yii-Framework bietet umfassende Unterstützung und detaillierte Dokumentation zum Erstellen von APIs. Hier sind einige der integrierten Funktionen beim Erstellen von APIs:

  • Schnelles Prototyping mit Unterstützung für gängige APIs für Active Record. Auf diese Weise können Sie die CRUD-Funktionalität des Datenmodells schnell und einfach über eine API verfügbar machen.
  • Aushandlung von Antwortformaten (standardmäßig unterstützt JSON und XML). Es gibt eine integrierte Unterstützung für die Rückgabe von Daten in gängigen Ausgabeformaten.
  • Anpassbare Objektserialisierung mit Unterstützung für auswählbare Ausgabefelder. Es ist einfach zu ändern, welche Daten zurückgegeben werden.
  • Richtige Formatierung der Erfassungsdaten und Validierungsfehler.
  • Unterstützung für Hypermedia als Engine of Application State (HATEOAS)
  • Effizientes Routing mit korrekter HTTP-Verbprüfung.
  • Eingebaute Unterstützung für die OPTIONEN und KOPF Verben.
  • Authentifizierung und Autorisierung.
  • Daten-Caching und HTTP-Caching.
  • Ratenbegrenzung.

Ich habe heute keine Gelegenheit, all das anzusprechen.

Mein Interesse an REST-APIs

In dieser Episode werde ich eine API erstellen, mit der wir die im Twixxr-Dienst erstellte Item-Tabelle anhand dieses Twitter-API-Tutorials bearbeiten können. Ich plane jedoch auch die Erstellung einer API für Meeting Planner, den Fokus unserer Startup-Reihe. Für die Erstellung einer iOS-Anwendung für den Dienst ist eine sichere API erforderlich. Die API ermöglicht die Kommunikation zwischen der mobilen App und dem Cloud-Service.

Erstellen des REST-Controllers

Mit Yiis REST-Framework erstellen wir einen Endpunkt für unsere API und organisieren Controller für jeden Ressourcentyp.

Die Ressourcen sind im Wesentlichen die Datenmodelle unserer Anwendung. Diese erweitern yii \ base \ Model. 

Die Klasse yii \ rest \ UrlRule bietet ein vorgefertigtes Routing, das unser Datenmodell den API-CRUD-Endpunkten zuordnet:

Erstellen eines Baums als API-Endpunkt

In der erweiterten Vorlage von Yii2 gibt es eine Front-End- und Back-End-Struktur, die erweiterbar ist. Um die API-Funktionen abzutrennen, erstellen wir einen dritten Baum, der nur als API-Endpunkt fungiert. 

Alex Makarov, Entwickler bei Yii, bietet diese hilfreiche Anleitung zum Erstellen zusätzlicher Bäume, denen ich folgte, um meinen dritten Baum zu erstellen:

$ cp -R Backend-API $ Cp -R-Umgebungen / dev / backend / Umgebungen / dev / api $ cp -R-Umgebungen / prod / backend / environment / prod / api 

Dann benutzte ich den Atom-Editor, um ein globales Suchen und Ersetzen von "Backend" durch "api" im neuen api-Baum durchzuführen.

Und ich habe den API-Alias ​​zu /common/config/bootstrap.php hinzugefügt:

Konfigurieren des URL-Routings für eingehende Anforderungen

In /api/config/main.php müssen wir das hinzufügen anfordern[] um das Setup von JSON zu parsen und die UrlRule Methoden für die Modelle und ihre Endpunkte zuordnen:

return ['id' => 'app-api', 'basePath' => dirname (__ DIR__), 'controllerNamespace' => 'api \ controller', 'bootstrap' => ['log'], 'modules' => [], 'components' => ['request' => ['parsers' => ['application / json' => 'yii \ web \ JsonParser'],],], 'urlManager' => ['enablePrettyUrl' = > true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [['class' => 'yii \ rest \ UrlRule', 'controller' => 'item'], ['class '=>' yii \ rest \ UrlRule ',' controller '=>' user '],],], 

Das ist im Grunde alles, was Sie brauchen, um einige umfassende API-Funktionen für diese Modelle zu aktivieren.

Beispiele mit cURL

Beginnen wir mit Anfragen.

OPTIONEN anfordern

Zeigen Sie mir verfügbare API-Methoden an:

curl -i -H "Accept: application / json" -X OPTIONS "http: // localhost: 8888 / api / items"

Hier ist die Antwort (GET, POST, KOPF, OPTIONEN):

HTTP / 1.1 200 OK Datum: Di, 25 Oct 2016 20:23:10 GMT Server: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Erlauben: GET, POST, HEAD, OPTIONS Inhalt-Länge: 0 Inhalt-Typ: Anwendung / Json; Zeichensatz = UTF-8 

GET-Anfragen

Anfrage: Wie viele Daten gibt es??

curl -i --head "http: // localhost: 8888 / api / items"

Antworten: 576 Datensätze auf 29 Seiten…

HTTP / 1.1 200 OK Datum: Di, 25 Oct 2016 23:17:37 GMT Server: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 X-Pagination-Gesamtzählung: 576 X-Pagination-Page-Count: 29 X- Pagination-Current-Page: 1 X-Pagination-Per-Page: 20 Link: ; rel = Selbst, ; rel = weiter, ; rel = letzter Inhaltstyp: application / json; Zeichensatz = UTF-8 

Anfrage: Zeigen Sie mir den Rekord 15:

curl -i "http: // localhost: 8888 / api / items / 15"

Antwort:

HTTP / 1.1 200 OK Datum: Di, 25 Oct 2016 23:19:27 GMT Server: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Inhaltslänge: 203 Inhaltstyp: application / json; charset = UTF-8 "id": 15, "title": "Jeff Reifman", "path": "jeffreifman", "detail": "", "status": 0, "posted_by": 1, "image_url ":", "Favoriten": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "create_at": 1477277956, "updated_at": 1477277956 

Anfrage: Zeigen Sie mir alle Daten auf Seite 3:

curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items? page = 3"

Antwort:

HTTP / 1.1 200 OK Datum: Di, 25 Oct 2016 23:30:21 GMT Server: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 X-Pagination-Gesamtzählung: 575 X-Pagination-Page-Count: 29 X- Pagination-Current-Page: 3 X-Pagination-Per-Page: 20 Link: ; rel = Selbst, ; rel = zuerst, ; rel = vor, ; rel = weiter, ; rel = letzte Inhaltslänge: 3999 Inhaltstyp: application / json; charset = UTF-8 ["id": 43, "title": "_ jannalynn", "path": "_ jannalynn", "detail": "", "status": 0, "posted_by": 1, "image_url ":", "Favoriten": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0,… "id": 99, "title": "alibrown", "path": " alibrown "," detail ":" "," status ": 0," posted_by ": 1," image_url ":" "," favourites ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 " : 0, "Created_at": 1477277956, "Updated_at": 1477277956]

LÖSCHEN Anfragen

Hier ist ein Beispiel für eine GET-Anforderung, gefolgt von einer DELETE-Anforderung und einem fehlgeschlagenen Folge-GET-Versuch:

$ curl -i -H "Akzeptieren: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 200 OK Datum: Di, 25 Oct 2016 23:32:17 GMT Server: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered -By: PHP / 7.0.10 Inhaltslänge: 186 Inhaltstyp: application / json; charset = UTF-8 "id": 8, "title": "aaker", "path": "aaker", "detail": "", "status": 0, "posted_by": 1, "image_url" : "", "Favoriten": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "create_at": 1477277956, "updated_at": 1477277956 $ curl -i -H "Akzeptieren: Anwendung / json "-X DELETE" http: // localhost: 8888 / api / items / 8 "HTTP / 1.1 204 No Datum des Inhalts: Di, 25 Oct 2016 23:32:26 GMT Server: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0 .10 Inhaltslänge: 0 Inhaltstyp: application / json; charset = UTF-8 $ curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 404 Nicht gefunden Datum: Di, 25 Oct 2016 23:32: 28 GMT-Server: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Inhaltslänge: 115 Inhaltstyp: application / json; charset = UTF-8 "name": "Not Found", "message": "Objekt nicht gefunden: 8", "code": 0, "status": 404, "type": "yii \\ web \\ NotFoundHttpException " 

Anforderungen für einen gelöschten Datensatz geben einen 404-Fehler zurück.

POST-Anfragen

Für meine Postanfragen habe ich zur Chrome Postman-App gewechselt:

Die Anmeldung für Postman war einfach:

Und dann konnte ich Anfragen an meine localhost-API in einer benutzerfreundlicheren GUI übermitteln:

Dann habe ich die Daten per curl abgerufen, Datensatz 577:

$ curl -i -H "Akzeptieren: application / json" "http: // localhost: 8888 / api / items / 577" HTTP / 1.1 200 OK Datum: Di, 25 Oct 2016 23:40:44 GMT Server: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered -By: PHP / 7.0.10 Inhaltslänge: 219 Inhaltstyp: application / json; charset = UTF-8 "id": 577, "title": "Jeff Reifman", "path": "reifman", "detail": "Ein Programmierer auf Erden.", "status": 0, "posted_by" : 1, "image_url": "", "favourites": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "create_at": 1477436477, "updated_at": 1477436477

Postman erwies sich als unerlässlich, um meine Tests abzurunden, da die Befehlszeilenoption für POST-Übertragungen nicht einfach zu konfigurieren war.

Vorausschauen

Neben der REST-Schnellstartübersicht bietet die Yii 2.0-Dokumentation Details zu einer Reihe anderer Aspekte der API-Erstellung:

  • Ressourcen
  • Controller
  • Routing
  • Antwortformatierung
  • Authentifizierung
  • Ratenbegrenzung
  • Versionierung
  • Fehlerbehandlung

Ich hoffe, dass ich in zukünftigen Episoden mehr davon erforschen kann. Eine der nächsten Schritte ist jedoch die Erstellung einer API für Meeting Planner in der Startserie.

Abschließend ist der Aufbau einer grundlegenden REST-API mit dem Yii MVC-Framework recht einfach. Das Yii-Team hat großartige Funktionen zur Standardisierung der Funktionalität für eine sehr wichtige Anforderung, die REST-APIs, geleistet. Ich hoffe, es hat dir Spaß gemacht, über sie zu lernen.

Wenn Sie Fragen oder Anregungen haben, posten Sie diese bitte in den Kommentaren. Wenn Sie mit meinen zukünftigen Envato Tuts + -Tutorials und anderen Serien mithalten möchten, besuchen Sie bitte meine Instructor-Seite oder folgen Sie @reifman. Schauen Sie sich unbedingt meine Startserie und den Meeting Planner an.

ähnliche Links

  • Yii2 Developer Exchange, meine Website für Yii2-Ressourcen
  • Schnellstart - RESTful Web Services - Das definitive Handbuch zu Yii 2.0
  • Google Chrome Store: Postman-Anwendung