Programmeren met Yii2 een RESTful API bouwen

Wat je gaat creëren

In deze Programmeren met de Yii2-serie, Ik leid lezers in gebruik van het Yii2 Framework voor PHP. Mogelijk bent u ook geïnteresseerd in mijn Introductie tot het Yii Framework, die de voordelen van Yii beoordeelt en een overzicht bevat van wat er nieuw is in Yii 2.x.

In de tutorial van vandaag zal ik bekijken hoe een REST API te bouwen in Yii om uw applicatie te verbinden met de cloud, mobiele apps en andere services. Ik zal u door de snelstartgids van Yii's REST API leiden en context en voorbeelden geven van veelvoorkomende verzoeken.

Aan de slag met Yii REST API's

Het bouwen van REST API's in Yii is eigenlijk vrij eenvoudig. U kunt gebruikmaken van het bestaande MVC-framework, maar u maakt een afzonderlijk toegangspunt waarvoor u toegang wilt hebben tot verschillende soorten services (geen websitebezoekers).

De voordelen van het Yii REST-raamwerk

Het Yii Framework biedt brede ondersteuning en gedetailleerde documentatie voor het bouwen van API's. Hier zijn enkele van de ingebouwde mogelijkheden bij het bouwen van API's:

  • Snelle prototyping met ondersteuning voor algemene API's voor Active Record. Hiermee kunt u snel en gemakkelijk datamodel-CRUD-functionaliteit via een API blootstellen.
  • Onderhandeling over responsformaten (standaard ondersteunt JSON en XML). Er is ingebouwde ondersteuning voor het retourneren van gegevens in gangbare uitvoerformaten.
  • Aanpasbare objectserialisatie met ondersteuning voor selecteerbare outputvelden. Het is gemakkelijk om aan te passen welke gegevens worden geretourneerd.
  • Correct formatteren van verzamelingsgegevens en validatiefouten.
  • Ondersteuning voor Hypermedia als de engine van applicatie staat (HATEOAS)
  • Efficiënte routing met de juiste controle van het HTTP-werkwoord.
  • Ingebouwde ondersteuning voor de OPTIES en HOOFD werkwoorden.
  • Authenticatie en authorisatie.
  • Data caching en HTTP caching.
  • Snelheidsbeperkend.

Ik krijg vandaag geen kans om dit allemaal aan te raken.

Mijn interesse in REST-API's

In deze aflevering zal ik een API maken om de itemtabel die ik in de Twixxr-service heb gemaakt te manipuleren vanuit deze Twitter API-zelfstudie. Maar ik ben ook van plan om een ​​API te bouwen voor onze startup zelfstudiereeks focus, Meeting Planner. Een veilige API is nodig om een ​​iOS-applicatie voor de service te bouwen. De API zorgt voor communicatie tussen de mobiele app en de cloudservice.

De REST-controller bouwen

Met het REST-framework van Yii maken we een eindpunt voor onze API en organiseren we controllers voor elk type resource.

De middelen zijn in essentie de datamodellen van onze applicatie. Deze breiden yii \ base \ Model uit. 

De klasse yii \ rest \ UrlRule biedt kant-en-klare routering die ons gegevensmodel toewijst aan API CRUD-eindpunten:

Een boom maken om te fungeren als een API-eindpunt

In de Yii2 Advanced-sjabloon is er een front-end en een back-end-boomstructuur, en deze is uitbreidbaar. Om de API-functies te scheiden, maken we een derde structuur die puur als een API-eindpunt fungeert. 

Yii-ontwikkelaar Alex Makarov biedt deze nuttige handleiding voor het maken van extra bomen die ik heb gevolgd om mijn derde stamboom te maken:

$ cp -R backend api $ cp -R environments / dev / backend / environments / dev / api $ cp -R environments / prod / backend / environments / prod / api 

Vervolgens gebruikte ik de Atom-editor om een ​​globale vind-en-vervanging van "backend" met "api" in de nieuwe api-tree te maken.

En ik heb de api alias toegevoegd aan /common/config/bootstrap.php:

De URL-routering voor inkomende aanvragen configureren

In /api/config/main.php moeten we het toevoegen verzoek[] om setup JSON-parsing en de UrlRule om methoden voor de modellen en hun eindpunten te associëren:

return ['id' => 'app-api', 'basePath' => dirname (__ DIR__), 'controllerNamespace' => 'api \ controllers', 'bootstrap' => ['log'], 'modules' => [], 'componenten' => ['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 '=>' gebruiker '],],], 

Dat is eigenlijk alles wat nodig is om enkele rijke API-functionaliteit voor deze modellen in te schakelen.

Voorbeelden met cURL

Laten we beginnen met het maken van verzoeken.

OPTIONS aanvragen

Toon mij beschikbare API-methoden:

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

Dit is het antwoord (KRIJGEN, POST, HOOFD, OPTIES):

HTTP / 1.1 200 OK Datum: di, 25 okt 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. 2 uur DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Allow: GET, POST, HEAD, OPTIES Content-Length: 0 Content-Type: application / json; charset = UTF-8 

Ontvang verzoeken

Verzoek: hoeveel gegevens zijn er?

krul -i - kop "http: // localhost: 8888 / api / items"

Antwoord: 576 records op 29 pagina's ...

HTTP / 1.1 200 OK Datum: di, 25 okt 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. 2 uur 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-Total-Count: 576 X-Pagination-Page-Count: 29 X- Paginering-Huidige pagina: 1 X-paginering-Per-pagina: 20 Link: ; rel = zelf, ; rel = next, ; rel = last Content-Type: application / json; charset = UTF-8 

Verzoek: toon mij record 15:

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

Reactie:

HTTP / 1.1 200 OK Datum: di, 25 okt 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. 2 uur DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Content-Length: 203 Inhoudstype: application / json; charset = UTF-8 "id": 15, "title": "Jeff Reifman", "path": "jeffreifman", "detail": "", "status": 0, "posted_by": 1, "image_url ":" "," favorieten ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0," created_at ": 1477277956," updated_at ": 1477277956 

Verzoek: toon mij alle gegevens op pagina 3:

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

Reactie:

HTTP / 1.1 200 OK Datum: di, 25 okt 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. 2 uur 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-Total-Count: 575 X-Pagination-Page-Count: 29 X- Paginering-Huidige pagina: 3 X-paginering-Per-pagina: 20 Link: ; rel = zelf, ; rel = eerste, ; rel = prev, ; rel = next, ; rel = last Content-Length: 3999 Content-Type: application / json; charset = UTF-8 ["id": 43, "title": "_ jannalynn", "path": "_ jannalynn", "detail": "", "status": 0, "posted_by": 1, "image_url ":" "," favorieten ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0, ... " id ": 99," title ":" alibrown "," path ":" alibrown "," detail ":" "," status ": 0," posted_by ": 1," image_url ":" "," favorites ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 " : 0, "created_at": 1477277956, "updated_at": 1477277956]

VERWIJDER verzoeken

Hier is een voorbeeld van een GET-verzoek gevolgd door een VERWIJDEREN-verzoek en vervolgens een mislukte vervolg-poging van GET:

$ curl -i -H "Accepteren: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 200 OK Datum: di, 25 okt 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 -Door: PHP / 7.0.10 Inhoud-lengte: 186 Inhoudstype: toepassing / json; charset = UTF-8 "id": 8, "title": "aaker", "path": "aaker", "detail": "", "status": 0, "posted_by": 1, "image_url" : "", "favorieten": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477277956, "updated_at": 1477277956 $ curl -i -H "Accepteren: toepassing / json "-X DELETE" http: // localhost: 8888 / api / items / 8 "HTTP / 1.1 204 Geen inhoudsdatum: din, 25 okt 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 Content-Length: 0 Content-Type: application / json; charset = UTF-8 $ curl -i -H "Accepteren: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 404 Niet gevonden Datum: di, 25 okt 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 Content-Length: 115 Content-Type: application / json; charset = UTF-8 "name": "Not Found", "message": "Object niet gevonden: 8", "code": 0, "status": 404, "type": "yii \\ web \\ NotFoundHttpException " 

Verzoeken om een ​​verwijderde record retourneren een 404-fout.

POST-aanvragen

Voor mijn postverzoeken schakelde ik over naar de Chrome Postman-app:

Aanmelden voor Postman was eenvoudig:

En toen kon ik verzoeken indienen bij mijn localhost API in een vriendelijkere GUI:

Vervolgens heb ik de gegevens opgehaald via curl, opnemen 577:

$ curl -i -H "Accepteren: application / json" "http: // localhost: 8888 / api / items / 577" HTTP / 1.1 200 OK Datum: di, 25 okt 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 -Door: PHP / 7.0.10 Content-Length: 219 Content-Type: application / json; charset = UTF-8 "id": 577, "title": "Jeff Reifman", "path": "reifman", "detail": "Een programmeur op aarde.", "status": 0, "posted_by" : 1, "image_url": "", "favorites": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477436477, "updated_at": 1477436477

Postman bleek essentieel om mijn testen af ​​te ronden, omdat het niet gemakkelijk was om Curl te configureren voor POST-inzendingen.

Vooruit kijken

Naast het REST quickstart-overzicht, biedt de Yii 2.0-documentatie informatie over een aantal andere aspecten van het maken van API's:

  • Middelen
  • Controllers
  • routing
  • Reactieopmaak
  • authenticatie
  • Snelheidsbeperking
  • Versioning
  • Foutafhandeling

Ik hoop de kans te krijgen om meer van deze te ontdekken in toekomstige afleveringen. Maar zeker, een van de volgende stappen is het maken van een API voor Meeting Planner in de opstartreeks.

Tot slot, het bouwen van een eenvoudige REST API met het Yii MVC-framework is vrij eenvoudig. Het Yii-team heeft uitstekend werk gedaan door de functionaliteit te standaardiseren voor een zeer belangrijke vereiste, REST-API's. Ik hoop dat je het leuk vond om er meer over te leren.

Als je vragen of suggesties hebt, plaats deze dan in de comments. Als je graag mijn toekomstige Envato Tuts + tutorials en andere series wilt volgen, ga dan naar mijn instructeurspagina of volg @reifman. Bekijk zeker mijn opstartserie en Meeting Planner.

Gerelateerde Links

  • Yii2 Developer Exchange, mijn Yii2-bronsite
  • Snelle start - RESTful Web Services - De definitieve gids voor Yii 2.0
  • Google Chrome Store: postbode-applicatie