Programmazione con Yii2 creazione di un'API RESTful

Cosa starai creando

In questo Programmazione con la serie Yii2, Sto guidando i lettori sull'uso di Yii2 Framework per PHP. Potresti anche essere interessato al mio Introduzione al framework Yii, che rivede i vantaggi di Yii e include una panoramica delle novità in Yii 2.x.

Nel tutorial di oggi, esaminerò come creare un'API REST in Yii per connettere l'applicazione al cloud, alle app mobili e ad altri servizi. Ti guiderò attraverso la guida rapida dell'API REST di Yii e fornirò il contesto e esempi di richieste comuni.

Introduzione alle API RII di Yii

Costruire API REST in Yii è in realtà abbastanza semplice. È possibile sfruttare il framework MVC esistente, ma si sta creando un punto di accesso distinto a cui si intende accedere da diversi tipi di servizi (non dai visitatori del sito Web).

I vantaggi del framework YII REST

Il framework Yii fornisce ampio supporto e documentazione dettagliata per la creazione di API. Ecco alcune delle funzionalità integrate durante la creazione di API:

  • Prototipazione rapida con supporto per API comuni per Active Record. Ciò consente di esporre rapidamente e facilmente le funzionalità CRUD del modello di dati tramite un'API.
  • Negoziazione del formato di risposta (supporto di JSON e XML per impostazione predefinita). È disponibile il supporto integrato per la restituzione dei dati nei formati di output comuni.
  • Serializzazione degli oggetti personalizzabile con supporto per campi di output selezionabili. È facile modificare quali dati vengono restituiti.
  • Formattazione corretta dei dati di raccolta e degli errori di convalida.
  • Supporto per Hypermedia As The Engine Of Application State (HATEOAS)
  • Instradamento efficiente con controllo verbo HTTP adeguato.
  • Supporto integrato per OPZIONI e CAPO verbi.
  • Autenticazione e autorizzazione.
  • Memorizzazione nella cache dei dati e memorizzazione nella cache HTTP.
  • Limitazione di velocità.

Non avrò la possibilità di toccare tutto questo oggi.

Il mio interesse per le API REST

In questo episodio, costruirò un'API per permetterci di manipolare la tabella degli articoli creata nel servizio Twixxr da questo tutorial sull'API di Twitter. Ma sto anche progettando di creare un'API per il focus della nostra serie di tutorial di avvio, Meeting Planner. Un'API sicura sarà necessaria per creare un'applicazione iOS per il servizio. L'API consentirà la comunicazione tra l'app mobile e il servizio cloud.

Costruire il controller REST

Con il framework REST di Yii, creeremo un endpoint per la nostra API e organizzeremo i controller per ciascun tipo di risorsa.

Le risorse sono essenzialmente i modelli di dati della nostra applicazione. Questi estendono yii \ base \ Model. 

La classe yii \ rest \ UrlRule fornisce il routing già pronto per mappare il nostro modello di dati agli endpoint CRUD API:

Creazione di un albero per agire come endpoint API

Nel modello Yii2 Advanced, c'è un albero front-end e back-end, e questo è estensibile. Per separare le funzioni API, creeremo un terzo albero per agire esclusivamente come endpoint API. 

Lo sviluppatore di Yii, Alex Makarov, fornisce questa guida utile alla creazione di ulteriori alberi che ho seguito per creare il mio terzo albero:

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

Quindi, ho usato l'editor Atom per fare una ricerca globale e sostituire "backend" con "api" nel nuovo albero api.

E ho aggiunto l'alias API a /common/config/bootstrap.php:

Configurazione del routing degli URL per le richieste in entrata

In /api/config/main.php, abbiamo bisogno di aggiungere il richiesta[] per analizzare l'analisi di JSON e il UrlRule associare metodi per i modelli e i relativi endpoint:

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' => 'elemento'], ['class '=>' yii \ rest \ UrlRule ',' controller '=>' utente '],],], 

Questo è praticamente tutto ciò che serve per abilitare alcune funzionalità API avanzate per questi modelli.

Esempi con cURL

Iniziamo a fare richieste.

Richiesta di OPZIONI

Mostrami i metodi API disponibili:

curl -i -H "Accetta: application / json" -X OPZIONI "http: // localhost: 8888 / api / items"

Ecco la risposta (OTTIENI, POSTA, TESTA, OPZIONI):

HTTP / 1.1 200 OK Data: Mar, 25 Ott 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 Consenti: GET, POST, HEAD, OPZIONI Lunghezza contenuto: 0 Content-Type: application / jSON; charset = UTF-8 

Ottieni richieste

Richiesta: quanti dati ci sono?

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

Risposta: 576 record su 29 pagine ...

HTTP / 1.1 200 OK Data: Martedì, 25 Ott 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-Total-Count: 576 X-Pagination-Page-Count: 29 X- Paginazione-Pagina corrente: 1 X-Paginazione-Per-Pagina: 20 Link: ; rel = auto, ; rel = next, ; rel = last Content-Type: application / json; charset = UTF-8 

Richiesta: mostrami il record 15:

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

Risposta:

HTTP / 1.1 200 OK Data: Martedì, 25 Ott 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 Content-Length: 203 Content-Type: application / json; charset = UTF-8 "id": 15, "titolo": "Jeff Reifman", "percorso": "jeffreifman", "detail": "", "status": 0, "posted_by": 1, "image_url ":" "," preferiti ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0," created_at ": 1477277956," updated_at ": 1477277956 

Richiesta: mostrami tutti i dati a pagina 3:

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

Risposta:

HTTP / 1.1 200 OK Data: mar, 25 ott 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-Total-Count: 575 X-Pagination-Page-Count: 29 X- Paginazione-Pagina corrente: 3 X-Pagination-Per-Page: 20 Link: ; rel = auto, ; rel = primo, ; rel = prev, ; rel = next, ; rel = last Content-Length: 3999 Content-Type: application / json; charset = UTF-8 ["id": 43, "titolo": "_ jannalynn", "percorso": "_ jannalynn", "dettaglio": "", "stato": 0, "postato_by": 1, "image_url ":" "," preferiti ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0, ... " id ": 99," titolo ":" alibrown "," percorso ":" alibrown "," detail ":" "," status ": 0," posted_by ": 1," image_url ":" "," preferiti ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 " : 0, "created_at": 1477277956, "updated_at": 1477277956]

ELIMINA Richieste

Ecco un esempio di una richiesta GET seguita da una richiesta DELETE e quindi un tentativo GET di follow-up non riuscito:

$ curl -i -H "Accetta: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 200 OK Data: Martedì, 25 ott 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 Content-Length: 186 Content-Type: application / json; charset = UTF-8 "id": 8, "title": "aaker", "path": "aaker", "detail": "", "status": 0, "posted_by": 1, "image_url" : "", "preferiti": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477277956, "updated_at": 1477277956 $ curl -i -H "Accettazione: applicazione / json "-X DELETE" http: // localhost: 8888 / api / items / 8 "HTTP / 1.1 204 Nessuna data di contenuto: mar, 25 ott 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 "Accetta: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 404 Not Found Data: Tue, 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 Lunghezza contenuto: 115 Content-Type: application / json; charset = UTF-8 "nome": "Non trovato", "messaggio": "Oggetto non trovato: 8", "codice": 0, "stato": 404, "tipo": "yii \\ web \\ NotFoundHttpException " 

Le richieste per un record eliminato restituiscono un errore 404.

Richieste POST

Per le mie richieste di post, ho passato all'app Chrome Postman:

Iscriversi a Postman è stato facile:

E poi sono stato in grado di inviare richieste alla mia API localhost in una GUI più amichevole:

Quindi, ho recuperato i dati tramite arricciatura, registra 577:

$ curl -i -H "Accetta: application / json" "http: // localhost: 8888 / api / items / 577" HTTP / 1.1 200 OK Data: Martedì, 25 Ott 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 Content-Length: 219 Content-Type: application / json; charset = UTF-8 "id": 577, "title": "Jeff Reifman", "path": "reifman", "detail": "Un programmatore sulla terra.", "status": 0, "posted_by" : 1, "image_url": "", "preferiti": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477436477, "updated_at": 1477436477

Il postino si è dimostrato essenziale per completare i miei test poiché l'arricciatura della riga di comando non era facile da configurare per le presentazioni POST.

Guardando avanti

Oltre alla panoramica rapida di REST, la documentazione di Yii 2.0 fornisce dettagli su una serie di altri aspetti della creazione dell'API:

  • risorse
  • Controller
  • Routing
  • Formattazione della risposta
  • Autenticazione
  • Limite di velocità
  • versioning
  • Gestione degli errori

Spero di avere la possibilità di esplorare più di questi nei prossimi episodi. Ma certamente, uno dei prossimi passi è creare un'API per Meeting Planner nelle serie di avvio.

In chiusura, la creazione di un'API REST di base con il framework Yii MVC è piuttosto semplice. Il team di Yii ha fatto un ottimo lavoro di standardizzazione delle funzionalità per un requisito molto importante, le API REST. Spero ti sia divertito a conoscerli.

Se avete domande o suggerimenti, per favore pubblicateli nei commenti. Se desideri tenere il passo con il mio futuro Envato Tuts + tutorial e altre serie, visita la pagina del mio istruttore o segui @reifman. Sicuramente controlla le mie serie di startup e Meeting Planner.

Link correlati

  • Yii2 Developer Exchange, il mio sito di risorse Yii2
  • Avvio rapido - RESTful Web Services - The Definitive Guide to Yii 2.0
  • Google Chrome Store: applicazione Postman