Programmering med Yii2 Bygg en RESTful API

Hva du skal skape

I dette Programmering med Yii2-serien, Jeg veileder lesere i bruk av Yii2 Framework for PHP. Du kan også være interessert i min Introduksjon til Yii Framework, som vurderer fordelene med Yii og inneholder en oversikt over hva som er nytt i Yii 2.x.

I dagens veiledning vurderer jeg hvordan du bygger en REST API i Yii for å koble applikasjonen din til skyen, mobilappene og andre tjenester. Jeg veileder deg gjennom Yiis REST APIs hurtigstartguide og gir sammenheng og eksempler på vanlige forespørsler.

Komme i gang med Yii REST APIer

Å bygge REST API'er i Yii er faktisk ganske grei. Du kan utnytte eksisterende MVC-rammeverk, men du oppretter et tydelig tilgangspunkt som du har til hensikt å få tilgang til av ulike typer tjenester (ikke besøkende på nettstedet).

Fordelene ved Yii REST Framework

Yii Framework gir bred støtte og detaljert dokumentasjon for å bygge APIer. Her er noen av de innebygde funksjonene når du bygger APIer:

  • Rask prototyping med støtte for vanlige APIer for Active Record. Dette gjør at du raskt og enkelt kan avsløre datamodul CRUD-funksjonalitet via en API.
  • Svarformatforhandling (som standard støtter JSON og XML). Det er innebygd støtte for returdata i vanlige utdataformater.
  • Tilpassbar objekt serialisering med støtte for valgbare utdatafelt. Det er enkelt å endre hvilke data som returneres.
  • Riktig formatering av samlingsdata og valideringsfeil.
  • Støtte for hypermedia som motor av applikasjonsstat (HATEOAS)
  • Effektiv ruting med riktig HTTP verifikasjonskontroll.
  • Innebygd støtte for ALTERNATIVER og HODE verb.
  • Godkjenning og autorisasjon.
  • Data caching og HTTP caching.
  • Vurder begrense.

Jeg har ikke mulighet til å ta på alt dette i dag.

Min interesse for REST APIer

I denne episoden vil jeg bygge en API for å la oss manipulere varetabellen jeg opprettet i Twixxr-tjenesten fra denne Twitter API-opplæringen. Men jeg planlegger også å bygge en API for vår oppstartsprosess serie fokus, Meeting Planner. En sikker API vil være nødvendig for å bygge et iOS-program for tjenesten. API-en vil aktivere kommunikasjon mellom mobilappen og skyttjenesten.

Bygg REST Controller

Med Yiis REST-rammeverk, oppretter vi et sluttpunkt for API-en og organiserer kontrollører for hver type ressurs.

Ressursene er i hovedsak vår applikasjons datamodeller. Disse utvider yii \ base \ Model. 

Yii \ resten \ UrlRule-klassen gir ferdig ruting som kartlegger vår datamodell til API CRUD-endepunkter:

Opprette et tre som skal fungere som API-endepunkt

I Yii2 Advanced-malen er det et front-end og back-end-tre, og dette er utvidbart. For å skille ut API-funksjonene, oppretter vi et tredje tre for å fungere som et API-endepunkt. 

Yii-utvikleren Alex Makarov gir denne hjelpsomme veiledningen for å lage flere trær som jeg fulgte med for å lage mitt tredje tre:

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

Deretter brukte jeg Atom-redaktøren til å gjøre en global finne og erstatte "backend" med "api" i det nye apitreet.

Og jeg la til api aliaset til /common/config/bootstrap.php:

Konfigurere URL-rutingen for innkommende forespørsler

I /api/config/main.php, må vi legge til be om[] å analysere oppsett JSON parsing og UrlRule å knytte metoder til modellene og deres sluttpunkter:

returnere ['id' => 'appPap', 'basePath' => dirname (__ DIR__), 'controllerNamespace' => 'api \ controllers', 'bootstrap' => ['logg'], 'moduler' => [], 'components' => ['parsers' => ['applikasjon / json' => 'yii \ web \ JsonParser',], 'urlManager' => ['enablePrettyUrl' = > true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [['class' => 'yii \ resten \ UrlRule', 'controller' => 'element'] '=>' yii \ resten \ UrlRule ',' controller '=>' bruker '],],], 

Det er i utgangspunktet alt som trengs for å aktivere noen rike API-funksjonalitet for disse modellene.

Eksempler med cURL

La oss begynne å lage forespørsler.

Be om OPTIONS

Vis meg tilgjengelige API-metoder:

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

Her er svaret (GET, POST, HEAD, OPTIONS):

HTTP / 1.1 200 OK Dato: Tue, 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 Tillat: GET, POST, HEAD, OPTIONS Innholdslengde: 0 Innholdstype: json; charset = UTF-8 

GET-forespørsler

Forespørsel: Hvor mye data er der?

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

Svar: 576 poster på 29 sider ...

HTTP / 1.1 200 OK Dato: Tue, 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. 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-paginering-Sum-Count: 576 X-Paginering-Page-Count: 29 X- Paginering-Nåværende Side: 1 X-Paginering-Per-Side: 20 Link: ; rel = selv, ; rel = neste, ; rel = siste innholdstype: application / json; charset = UTF-8 

Forespørsel: Vis meg post 15:

krølle -i "http: // localhost: 8888 / api / items / 15"

Respons:

HTTP / 1.1 200 OK Dato: Tue, 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 Innholdslengde: 203 Innholdstype: application / json; charset = UTF-8 "id": 15, "tittel": "Jeff Reifman", "bane": "jeffreifman", "detalj": "", "status": 0, "posted_by": 1, "image_url ":" "," favoritter ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0," created_at ": 1477277956," updated_at ": 1477277956 

Forespørsel: Vis meg alle dataene på side 3:

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

Respons:

HTTP / 1.1 200 OK Dato: Tue, 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-paginering-Total-Count: 575 X-Paginering-Page-Count: 29 X- Paginering-Nåværende Side: 3 X-Paginering-Per-Side: 20 Link: ; rel = selv, ; rel = først, ; rel = prev, ; rel = neste, ; rel = siste innholds lengde: 3999 innholdstype: application / json; charset = UTF-8 ["id": 43, "title": "_ jannalynn", "bane": "_ jannalynn", "detalj": "", "status": 0, "posted_by": 1, "image_url ":" "," favoritter ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0, ... " id ": 99," tittel ":" alibrown " alibrown "," detalj ":" "," status ": 0," posted_by ": 1," image_url ":" "," favoritter ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 " : 0, "created_at": 1477277956, "updated_at": 1477277956]

DELETE forespørsler

Her er et eksempel på en GET-forespørsel, etterfulgt av en DELETE-forespørsel og deretter et oppfølging mislyktes GET-forsøk:

$ curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 200 OK Dato: Tir, 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 Innholdslengde: 186 Innholdstype: application / json; charset = UTF-8 "id": 8, "tittel": "aaker", "bane": "aaker", "detalj": "", "status": 0, "posted_by": 1, "image_url" : "", "favoritter": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477277956, "updated_at": 1477277956 $ curl -i -H "Godta: søknad / json "-X SLETT" http: // localhost: 8888 / api / items / 8 "HTTP / 1.1 204 Ingen innholdsdato: tirsdag, 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 Innholdslengde: 0 Innholdstype: Application / json; charset = UTF-8 $ curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 404 Ikke funnet Dato: Tue, 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 Innholdslengde: 115 Content-Type: application / json; charset = UTF-8 "navn": "Ikke funnet", "melding": "Objekt ikke funnet: 8", "kode": 0, "status": 404, "type": "yii \\ web \\ NotFoundHttpException " 

Forespørsler om slettet post returnerer en 404 feil.

POST-forespørsler

For innleggene mine ble jeg byttet til Chrome Postman-appen:

Å registrere seg for Postman var enkelt:

Og så var jeg i stand til å sende inn forespørsler til min localhost API i en mer vennlig GUI:

Så hentet jeg dataene med krøll, ta opp 577:

$ curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items / 577" HTTP / 1.1 200 OK Dato: Tir, 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 Innholdslengde: 219 Innholdstype: Application / json; charset = UTF-8 "id": 577, "tittel": "Jeff Reifman", "sti": "reifman", "detalj": "En programmerer på jorden.", "Status": 0, "posted_by" : 1, "image_url": "", "favoritter": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477436477, "updated_at": 1477436477

Postman viste seg å være avgjørende for å avrunde testen min, da kommandolinjekretsen ikke var lett å konfigurere for POST-innsendinger.

Ser fremover

I tillegg til REST Quickstart-oversikten gir Yii 2.0-dokumentasjonen detaljert informasjon om en rekke andre aspekter ved API-oppretting:

  • ressurser
  • Controllers
  • routing
  • Svarformatering
  • Godkjenning
  • Ressursbegrensning
  • versjons~~POS=TRUNC
  • Feilhåndtering

Jeg håper å få muligheten til å utforske flere av disse i fremtidige episoder. Men sikkert, et av de neste trinnene er å opprette en API for møteplanlegger i oppstartsserien.

Til slutt er det ganske enkelt å bygge en grunnleggende REST API med Yii MVC-rammen. Yii-teamet har gjort en god jobb som standardiserer funksjonalitet for et svært viktig krav, REST APIs. Jeg håper du har likt å lære om dem.

Hvis du har spørsmål eller forslag, vennligst legg inn dem i kommentarene. Hvis du vil fortsette med fremtidige Envato Tuts + opplæringsprogrammer og andre serier, vennligst besøk min instruktørside eller følg @reifman. Sjekk sjekk ut min oppstartsserie og møteplanlegger.

Relaterte linker

  • Yii2 Developer Exchange, min Yii2 ressurs side
  • Hurtigstart - RESTful Web Services - Den Definitive Guide to Yii 2.0
  • Google Chrome Store: Postman Application