Programarea cu Yii2 Construirea unui API RESTful

Ce veți crea

In acest Programare cu seria Yii2, Îi conduc cititorii în folosirea cadrului Yii2 pentru PHP. Ați putea fi, de asemenea, interesat de mine Introducere în Cadrul Yii, care examinează beneficiile Yii și include o prezentare generală a ceea ce este nou în Yii 2.x.

În tutorialul de astăzi, voi examina cum să construiți un API REST în Yii pentru a vă conecta aplicația la cloud, aplicații mobile și alte servicii. Vă voi îndruma prin ghidul de inițiere rapidă a lui Yii REST și vă ofer context și exemple de solicitări comune.

Noțiuni de bază cu API-urile Yii REST

Clădirea API-urilor REST în Yii este de fapt destul de simplă. Puteți utiliza cadrul MVC existent, dar creați un punct de acces distinct pe care intenționați să îl accesați prin diferite tipuri de servicii (nu vizitatori de pe site).

Beneficiile cadrului RIP Yii

Cadrul Yii furnizează o largă asistență și o documentație detaliată pentru crearea API-urilor. Iată câteva dintre capabilitățile încorporate când construiți API-uri:

  • Protocoale rapide cu suport pentru API-uri comune pentru Active Record. Acest lucru vă permite să expuneți rapid și ușor funcționalitatea modelului de date CRUD prin intermediul unui API.
  • Răspuns la negocierea formatului (care acceptă în mod implicit JSON și XML). Există suport încorporat pentru returnarea datelor în formate de ieșire comune.
  • Serializarea obiectului personalizabil cu suport pentru câmpurile de ieșire selectabile. Este ușor să modificați datele returnate.
  • Formatarea corectă a datelor de colectare și a erorilor de validare.
  • Suport pentru Hypermedia ca motor al statului de aplicare (HATEOAS)
  • Rutarea eficientă cu verificarea corectă a verbului HTTP.
  • Suport încorporat pentru OPȚIUNI și CAP verbe.
  • Autentificare și autorizare.
  • Caching-ul datelor și cache-ul HTTP.
  • Limitare de rata.

Nu voi avea șansa să ating toate astea astăzi.

Interesul meu în API-urile REST

În acest episod, voi construi un API pentru a ne permite să manipulăm tabelul de articole pe care l-am creat în serviciul Twixxr din acest tutorial Twitter API. Dar, de asemenea, intenționez să construiesc un API pentru focalizarea în serie a tutorialului de pornire, Planificatorul întâlnirilor. Un API securizat va fi necesar pentru construirea unei aplicații iOS pentru acest serviciu. API-ul va permite comunicarea între aplicația mobilă și serviciul cloud.

Construirea controlerului REST

Cu cadrul REST al Yii, vom crea un punct final pentru API-ul nostru și vom organiza controlori pentru fiecare tip de resursă.

Resursele sunt, în esență, modelele de date ale aplicației noastre. Acestea extind yii \ base \ Model. 

Clasa yii \ rest \ UrlRule oferă direcții gata făcute pentru a cartografia modelul nostru de date pentru parametrii API CRUD:

Crearea unui arbore care să acționeze ca un punct final API

În șablonul Yii2 Advanced, există un arbore frontal și spate, iar acest lucru este extensibil. Pentru a separa funcțiile API, vom crea un al treilea arbore pentru a acționa doar ca un punct final pentru API. 

Dezvoltatorul Yii Alex Makarov oferă acest ghid util pentru crearea copacilor adiționali pe care i-am urmat pentru a crea cel de-al treilea copac:

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

Apoi, am folosit editorul Atom pentru a face o descoperire globală și a înlocui "backend" cu "api" în noul api tree.

Și am adăugat aliasul api la /common/config/bootstrap.php:

Configurarea rutarei adreselor URL pentru cererile primite

În /api/config/main.php, trebuie să adăugăm cerere[] pentru a parsa configurarea JSON parsarea și UrlRule să asocieze metode pentru modele și obiectivele lor finale:

return "[> id '=>' app-api ',' basePath '=> dirname (__ DIR__),' controllerNamespace '=>' api \ controllers ',' bootstrap '=> [], 'componente' => ['request' => ['parsers' => ['application / json' => 'enablePrettyUrl' = = > true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [['class' => 'yii \ rest \ UrlRule' '=>' yii \ rest \ UrlRule ',' controller '=>' utilizator '],],], 

Aceasta este în esență tot ceea ce este necesar pentru a permite unele funcționalități API bogate pentru aceste modele.

Exemple Cu cURL

Să începem să facem cereri.

Solicitarea OPȚIUNILOR

Arătați-mi metodele API disponibile:

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

Iată răspunsul (GET, POST, HEAD, OPȚIUNI):

HTTP / 1.1 200 OK Data: Tue, 25 Oct 2016 20:23:10 GMT Server: Apache / 2.2.31 (Unix) Mod_Windows / 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 Permiteți: GET, POST, HEAD, OPTIONS Content-Length: JSON; charset = UTF-8 

Cererile GET

Solicitare: Cât de multe date există?

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

Răspuns: 576 de înregistrări pe 29 de pagini ...

HTTP / 1.1 200 OK Data: Tue, 25 Oct 2016 23:17:37 GMT Server: Apache / 2.2.31 (Unix) Mod_Windows / 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-Pagină-Număr-Number: X- Pagini-pagini curente: 1 X-Pagination-Per-Page: 20 Link: ; rel = self, ; rel = next, ; rel = ultimul tip de conținut: application / json; charset = UTF-8 

Solicitare: Arată-mi înregistrarea 15:

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

Raspuns:

HTTP / 1.1 200 OK Data: Tue, 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 Continut-Lungime: 203 Content-Type: application / json; caractere = UTF-8 "id": 15, "titlu": "Jeff Reifman", "cale": "jeffreifman" "," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0," created_at ": 1477277956," updated_at ": 1477277956 

Solicitare: Afișează-mi toate datele de la pagina 3:

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

Raspuns:

HTTP / 1.1 200 OK Data: Tue, 25 Oct 2016 23:30:21 GMT Server: Apache / 2.2.31 (Unix) Mod_Windows / 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-Pagină-Număr-Count: Pagination-Pagina-curent: 3 X-paginare-pe-pagină: 20 Link: ; rel = self, ; rel = primul, ; rel = prev, ; rel = next, ; rel = ultimul conținut-lungime: 3999 Content-Type: application / json; caractere = UTF-8 ["id": 43, "titlu": "_ jannalynn", "path": "_jannalynn" "": "", "stat": 0, "stat_2": 0, "stat_3" "stat_2": 0, "stat_3": "0", "stat_2": 0, : 0, "created_at": 1477277956, "updated_at": 1477277956]

DELETE Solicitări

Iată un exemplu de solicitare GET, urmată de o solicitare DELETE și apoi o încercare GET de urmărire nereușită:

$ curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 200 OK Data: 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 Continut-Lungime: 186 Content-Type: aplicatie / json; caractere = UTF-8 "id": 8, "titlu": "aaker" : "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477277956, "updated_at": 1477277956 $ curl -i -H " / json "-X DELETE" http: // localhost: 8888 / api / items / 8 "HTTP / 1.1 204 Data de inscriere: 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: cerere / json; charset = UTF-8 $ curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 404 Not Found Data: 28 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 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Content-Length: 115 Tip de conținut: aplicație / json; charset = UTF-8 "nume": "Nu a fost găsit", "mesaj": "Obiect nu a fost găsit: 8", "cod": 0, "status": 404; NotFoundHttpException " 

Solicitările pentru o înregistrare șters returnează o eroare 404.

Cererile POST

Pentru solicitările mele de postare, am trecut la aplicația Posta Chrome:

Înscrierea la postman a fost ușoară:

Apoi am putut trimite cereri către API-ul meu localhost într-un GUI mai prietenos:

Apoi, am recuperat datele prin curl, înregistrare 577:

$ curl -i -H "Accept: application / json" "http: // localhost: 8888 / api / items / 577" HTTP / 1.1 200 OK Data: 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: 219 Tip de conținut: aplicație / json; caractere = UTF-8 "id": 577, "titlu": "Jeff Reifman", "path": "reifman", "detail" : 0, "stat_2": 0, "stat_3": 0, "created_at": 1477436477, "updated_at": 1477436477

Poștașul sa dovedit esențial pentru a încheia testarea mea, deoarece curbura liniei de comandă nu a fost ușor de configurat pentru depunerea POST.

Privind înainte

Pe lângă prezentarea rapidă a REST, documentația Yii 2.0 oferă detalii despre o serie de alte aspecte ale creării API:

  • Resurse
  • controlerele
  • Routing
  • Formatul răspunsului
  • Autentificare
  • Limitare de rata
  • versionare
  • Eroare de manipulare

Sper să aibă șansa de a explora mai multe dintre acestea în episoadele viitoare. Dar, cu siguranță, unul dintre pașii următori este crearea unui API pentru Planificatorul întâlnirilor în seria de pornire.

În încheiere, construirea unui API de bază REST cu cadrul MVC Yii este destul de simplă. Echipa Yii a făcut o slujbă excelentă standardizând funcționalitatea pentru o cerință foarte importantă, API-urile REST. Sper că v-ați bucurat să aflați despre ele.

Dacă aveți întrebări sau sugestii, vă rugăm să le postați în comentarii. Dacă doriți să continuați cu viitoarele tutoriale Envato Tuts + și alte serii, vă rugăm să vizitați pagina mea de instructor sau să urmați @reifman. În mod sigur, verificați seria de pornire și Planificatorul de întâlniri.

Link-uri conexe

  • Yii2 Developer Exchange, site-ul meu de resurse Yii2
  • Quick Start - Servicii Web RESTful - Ghidul definitiv pentru Yii 2.0
  • Magazinul Google Chrome: aplicația poștală
Cod