Programmering med Yii2 Skapa ett RESTful API

Vad du ska skapa

I denna Programmering med Yii2-serien, Jag vägledande läsare som använder Yii2 Framework for PHP. Du kanske också är intresserad av mina Introduktion till Yii Framework, som granskar fördelarna med Yii och innehåller en översikt över vad som är nytt i Yii 2.x.

I dagens handledning granskar jag hur man bygger ett REST API i Yii för att ansluta din applikation till molnet, mobilappar och andra tjänster. Jag guidar dig genom Yiis snabbguide för REST API och ger sammanhang och exempel på vanliga förfrågningar.

Komma igång med Yii REST API

Att bygga REST API i Yii är faktiskt ganska enkelt. Du kan utnyttja befintliga MVC-ramar, men du skapar en distinkt åtkomstpunkt som du tänker komma åt av olika typer av tjänster (inte besökare på webbplatsen).

Fördelarna med Yii REST Framework

Yii Framework erbjuder brett stöd och detaljerad dokumentation för att bygga API: er. Här är några av de inbyggda funktionerna när du bygger API: er:

  • Snabb prototyper med stöd för gemensamma API för Active Record. Detta gör att du snabbt och enkelt kan utsätta data-modellen CRUD-funktionalitet via ett API.
  • Svarformatförhandling (stödjer JSON och XML som standard). Det finns inbyggt stöd för att återställa data i vanliga utdataformat.
  • Anpassningsbar objekt serialisering med stöd för valbara utmatningsfält. Det är enkelt att ändra vilken data som returneras.
  • Korrekt formatering av insamlingsdata och valideringsfel.
  • Stöd för hypermedia som motor för ansökningsstaten (HATEOAS)
  • Effektiv routing med korrekt HTTP verb kontroll.
  • Inbyggt stöd för ALTERNATIV och HUVUD verb.
  • Godkännande och godkännande.
  • Datakachning och HTTP-caching.
  • Ränta begränsning.

Jag kommer inte att ha chans att röra på allt detta idag.

Min intresse för REST APIs

I det här avsnittet ska jag bygga ett API för att vi ska kunna manipulera den produkttabell jag skapade i Twixxr-tjänsten från denna Twitter API-handledning. Men jag planerar också att bygga ett API för vårt startfält seriefokus, mötesplanerare. Ett säkert API är nödvändigt för att bygga en iOS-applikation för tjänsten. API: n kommer att möjliggöra kommunikation mellan mobilappen och molntjänsten.

Bygga REST Controller

Med Yiis REST-ramar skapar vi en slutpunkt för vårt API och organiserar controllers för varje typ av resurs.

Resurserna är i huvudsak vår applikations datamodeller. Dessa sträcker sig yii \ base \ Model. 

Yii \ resten \ UrlRule-klassen ger färdiglagd routing som kartlägger vår datamodell till API CRUD-ändpunkter:

Skapa ett träd för att fungera som API-slutpunkt

I den avancerade mallen Yii2 finns det ett front-end- och backend-träd, och detta är utökbart. För att skilja ut API-funktionerna skapar vi ett tredje träd för att fungera som en API-ändpunkt. 

Yii-utvecklaren Alex Makarov ger den här hjälpsamma guiden för att skapa ytterligare träd som jag följde för att skapa mitt tredje träd:

$ cp -R backend api $ cp -R-miljöer / dev / backend / environments / dev / api $ cp -R-miljöer / prod / backend / environments / prod / api 

Sedan använde jag Atom-redaktören för att göra en global find och ersätta "backend" med "api" i det nya apiträdet.

Och jag lade till api alias till /common/config/bootstrap.php:

Konfigurera URL-routing för inkommande förfrågningar

I /api/config/main.php, måste vi lägga till begäran[] att analysera setup JSON-analysering och UrlRule att associera metoder för modellerna och deras slutpunkter:

returnera ['id' => 'app-api', 'basePath' => namnnamn (__ DIR__), 'controllerNamespace' => 'api \ controllers', 'bootstrap' => ['logg'], 'moduler' => [], 'components' => ['parsers' => ['applikation / json' => 'yii \ web \ JsonParser',], 'urlManager' => ['enablePrettyUrl' = > true, 'enableStrictParsing' => true, 'showScriptName' => falskt, 'rules' => [['class' => 'yii \ resten \ UrlRule', 'controller' => 'objekt'] '=>' yii \ vila \ UrlRule ',' controller '=>' användare '],],], 

Det är i princip allt som krävs för att möjliggöra en del API-funktionalitet för dessa modeller.

Exempel med cURL

Låt oss börja göra förfrågningar.

Begär OPTIONS

Visa mig tillgängliga API-metoder:

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

Här är svaret (GET, POST, HEAD, OPTIONS):

HTTP / 1.1 200 OK Datum: tis, 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. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Tillåt: GET, POST, HEAD, OPTIONS Innehållslängd: 0 Innehållstyp: json; charset = UTF-8 

GET-förfrågningar

Begär: Hur mycket data finns det??

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

Svar: 576 poster över 29 sidor ...

HTTP / 1.1 200 OK Datum: Tis, 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.3. 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-Totalt antal: 576 X-Pagination-Sidantal: 29 X- Pagination-Current-Page: 1 X-Pagination-Per-Page: 20 Länk: ; rel = själv, ; rel = nästa, ; rel = senaste innehållstyp: application / json; charset = UTF-8 

Förfrågan: Visa mig post 15:

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

Svar:

HTTP / 1.1 200 OK Datum: tis, 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. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Innehållslängd: 203 Innehållstyp: Application / json; charset = UTF-8 "id": 15, "title": "Jeff Reifman", "sökväg": "jeffreifman", "detalj": "", "status": 0, "posted_by": 1, "image_url ":", "favoriter": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477277956, "updated_at": 1477277956 

Förfrågan: Visa mig alla data på sidan 3:

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

Svar:

HTTP / 1.1 200 OK Datum: tis, 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. 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-Totalt antal: 575 X-Pagination-Sidantal: 29 X- Pagination-Current-Page: 3 X-Pagination-Per-Page: 20 Länk: ; rel = själv, ; rel = första, ; rel = prev, ; rel = nästa, ; rel = sista innehållslängd: 3999 Innehållstyp: application / json; charset = UTF-8 ["id": 43, "title": "_ jannalynn", "sökväg": "_ jannalynn", "detalj": "", "status": 0, "posted_by": 1, "image_url ":", "favoriter": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, ... "id": 99, "title": "alibrown" "status": 0, "stat_3": 1, "image_url" : 0, "created_at": 1477277956, "updated_at": 1477277956]

DELETE Förfrågningar

Här är ett exempel på en GET-förfrågan följd av en DELETE-förfrågan och sedan ett uppföljnings misslyckat GET-försök:

$ curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 200 OK Datum: tis, 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 -By: PHP / 7.0.10 Innehållslängd: 186 Innehållstyp: Application / json; charset = UTF-8 "id": 8, "title": "aaker", "path": "aaker", "detalj": "", "status": 0, "posted_by": 1, "image_url" : "", "favoriter": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477277956, "updated_at": 1477277956 $ curl -i -H "Acceptera / json "-X DELETE" http: // localhost: 8888 / api / items / 8 "HTTP / 1.1 204 Inget innehållsdatum: tis, 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 Innehållslängd: 0 Innehållstyp: Application / json; charset = UTF-8 $ curl -i -H "Acceptera: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 404 Ej funnen Datum: tis 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 Innehållslängd: 115 Innehållstyp: Application / json; charset = UTF-8 "name": "Ej hittat", "meddelande": "Objekt som inte hittades: 8", "kod": 0, "status": 404, "typ": "yii \\ web \\ NotFoundHttpException " 

Begäran om en borttagen post returnerar ett 404-fel.

POST-förfrågningar

För mina efterfrågningar bytte jag till Chrome Postman-appen:

Att registrera Postman var lätt:

Och då kunde jag skicka in förfrågningar till mitt lokalahost-API i en mer användbar GUI:

Sedan hämtade jag data via curl, spela in 577:

$ curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items / 577" HTTP / 1.1 200 OK Datum: tis, 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 -By: PHP / 7.0.10 Innehållslängd: 219 Innehållstyp: Application / json; charset = UTF-8 "id": 577, "title": "Jeff Reifman", "sökväg": "reifman", "detalj": "En programmerare på jorden.", "Status": 0, "posted_by" : 1, "image_url": "", "favoriter": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477436477, "updated_at": 1477436477

Postman visade sig vara avgörande för att runda ut testningen eftersom kommandoradskrull inte var lätt att konfigurera för POST-inlägg.

Blickar framåt

Förutom sin REST snabbstartsöversikt, innehåller Yii 2.0-dokumentationen detaljer om en rad andra aspekter av API-skapandet:

  • Medel
  • controllers
  • routing
  • Svarformatering
  • autentisering
  • Räntebegränsning
  • versionshantering
  • Felhantering

Jag hoppas kunna få chansen att utforska mer av dessa i framtida episoder. Men säkert är ett av de följande stegen att skapa ett API för mötesplaneraren i startserien.

Slutligen är det ganska enkelt att bygga ett grundläggande REST API med Yii MVC-ramverket. Yii-laget har gjort ett bra jobb att standardisera funktionaliteten för ett mycket viktigt krav, REST API. Jag hoppas att du har haft lust om dem.

Om du har några frågor eller förslag, vänligen skicka in dem i kommentarerna. Om du vill hålla koll på mina framtida Envato Tuts + handledning och andra serier, besök min instruktörssida eller följ @reifman. Kolla in min start-serie och mötesplanerare.

relaterade länkar

  • Yii2 Developer Exchange, min Yii2 resurs webbplats
  • Snabbstart - RESTful Web Services - Den Definitive Guide till Yii 2.0
  • Google Chrome Store: Postman Application