Lavorare con i servizi RESTful in CodeIgniter

CodeIgniter sta diventando ben noto per la sua potenza come un framework per applicazioni web basato su PHP, ma non capita spesso di vedere esempi di esso per qualcos'altro. Oggi impareremo come utilizzare CodeIgniter per creare un'API RESTful per le tue applicazioni web esistenti e dimostrare come interagire con la tua API o altri servizi web RESTful, come Facebook e Twitter.

Come forse saprai, puoi trovare un'ampia selezione di script e app CodeIgniter su Envato Market, dagli script di iscrizione ai gestori di menu e molto altro.

Dettagli dell'esercitazione

  • Programma: CodeIgniter, server REST CodeIgniter e client REST CodeIgniter
  • Difficoltà: medio
  • Tempo di completamento stimato: 30 minuti

introduzione

Se hai seguito il CodeIgniter From Scratch serie saprete ormai che è relativamente semplice e veloce mettere insieme semplici applicazioni web, come blog, sistemi CMS, siti di brochure, ecc. Una cosa su cui forse non avete pensato è usare CodeIgniter per creare un'API interattiva. Dopo aver provato diverse implementazioni REST esistenti, ho scoperto che non solo mancavano di semplicità ma che mancavano molte delle funzionalità che ci si aspetterebbe da un'implementazione RESTful; così ho costruito il mio. Questo tutorial ti mostrerà come utilizzare questo codice per configurare la tua API REST e fornisce esempi su come interagire con essa dalla tua applicazione web.

ipotesi

  1. Hai un server web configurato, localmente o online e sai come gestire i file su di esso.
  2. Hai letto alcuni dei CodeIgniter dei tutorial di Scratch.
  3. Sai come configurare CodeIgniter.
  4. Conosci un po 'di servizi RESTful.

Questo tutorial è suddiviso in due parti. Inizieremo imparando come creare un servizio RESTful, quindi più in basso impareremo come interagire con esso in diversi modi.

Parte 1: creazione di un'API RESTful

Passaggio 1: impostazione della demo

Per prima cosa devi scaricare il codice codeigniter-restserver da GitHub ed estrarlo e spostare il codice sul tuo server.

Quando apri la cartella, vedrai un'intera installazione CodeIgniter, che è lì per alimentare la demo. Ciò consente alle persone di giocare con la demo REST prima di integrarsi con l'applicazione esistente.

Aprire "Application / config / config.php" e imposta il valore base_url per far funzionare i collegamenti. Questo base_url sarà diverso per tutti e dipende interamente da dove hai caricato i tuoi file.

Passaggio 2: gli URL

Con i file estratti e il set base_url, siamo pronti per caricare la nostra installazione CodeIgniter RESTful e dare un'occhiata alla demo fornita con esso. Sfoglia l'URL di base, che per impostazione predefinita è:

http: // localhost / restserver

Qui troverai alcuni link di esempio al example_api controller, che può essere trovato su "Application / controller / example_api.php". Analizziamo l'URL di questi esempi per vedere cosa sta succedendo. Il primo URL è molto semplice.

Questo URL assomiglia molto a qualsiasi altro URL CodeIgniter con un controller e un metodo, ma in questo diagramma si noterà che il metodo è denominato "Risorsa". REST è interamente basato sulle risorse e sono essenzialmente un nome all'interno dell'applicazione, a cui si interagisce (cioè aggiunto, eliminato, modificato, interrogato) basato su intestazioni HTTP e stringhe di query URL o argomenti HTTP.

Il formato predefinito per l'output è XML, che è ciò che vediamo in questo esempio di base. Gli altri link sono leggermente più grandi e mostrano come passare i parametri e mostrare come il formato di output può essere modificato nell'URL:

Normalmente in CodeIgniter, si passano solo i valori dei parametri, ma un controller REST accetta qualsiasi numero di parametri in qualsiasi ordine. Perché ciò funzioni, dobbiamo passare il nome del parametro seguito dal valore in coppia.

Alla fine dell'URL è il parametro "format". Questo è un parametro riservato che modificherà il formato di output dei dati richiesti in questo modo:

Offrendo allo sviluppatore API e all'applicazione client la scelta dei formati di dati da utilizzare, l'API viene aperta a un pubblico molto più ampio e può essere utilizzata con più linguaggi e sistemi di programmazione. Questi tre non sono gli unici formati supportati, che possono essere utilizzati dalla tua API REST:

  • xml - quasi tutti i linguaggi di programmazione possono leggere XML
  • jSON - utile per JavaScript e sempre più applicazioni PHP.
  • csv - apri con programmi di fogli di calcolo
  • html - una semplice tabella HTML
  • php - Rappresentazione del codice PHP che può essere eval () 'ed
  • serializzare - Dati serializzati che possono essere non serializzati in PHP

Mentre aggiungere il formato all'URL non è tecnicamente il modo più RESTful per cambiare i formati, consente un facile test del browser e consente agli sviluppatori senza cURL di eseguire semplici richieste GET sull'API. Il modo più RESTful è quello di inviare un Tipo di contenuto Intestazione HTTP per il controller REST utilizzando cURL, ma ciò verrà spiegato in seguito.

Passaggio 3: il codice

Ora se ti apri application / controller / example_api.php vedrai immediatamente alcune differenze rispetto ai normali controller CodeIgniter.

REST_Controller

Nel pattern MVC, un controller è il punto centrale della logica. Viene chiamato quando un utente effettua una richiesta e, in base alla logica nel controller, recupera i dati e le visualizzazioni. CodeIgniter contiene la propria logica per come dovrebbe funzionare un controller, ma poiché stiamo facendo qualcosa di diverso, abbiamo bisogno della nostra libreria REST_Controller per contenere la sua logica relativa a REST. Quindi, invece di usare semplicemente:

 

... dovrai usare:

 

Lavorare con le risorse

Ora il tuo controller vuoto è impostato, i prossimi sono i metodi o "risorse". Questa è prossimamente la parte più confusa del tutorial se sei abituato a come funziona CodeIgniter. Fondamentalmente, si prende la risorsa e il verbo HTTP e si combinano per creare un nome di metodo. Quindi i due esempi che abbiamo visto prima avevano una Risorsa di utente e utenti. Poiché entrambi sono stati caricati nel browser, sappiamo che stava utilizzando una richiesta GET e quindi vengono utilizzati i seguenti due metodi:

 

Questo può sembrare un po 'strano, ma ti dà la possibilità di utilizzare lo stesso URL e rispondere alla richiesta a seconda del verbo HTTP che è stato utilizzato. Se qualcuno tenta di accedere alla tua API in un modo che non è permesso (in questo esempio PUT o DELETE) risponderà semplicemente con un 404. Se non sei sicuro dei verbi HTTP, lasciami spiegare.

OTTENERE

Utilizzato per recuperare informazioni su una risorsa esistente. Questo è usato dai browser quando inserisci un URL e premi vai, o quando fai clic su un link, quindi è perfetto per recuperare informazioni su una delle tue risorse REST (come utente).

INVIARE

Utilizzato per aggiornare una risorsa esistente con informazioni. I browser lo utilizzano per inviare la maggior parte dei tipi di moduli su Internet, sebbene alcuni utilizzino GET anche inviando l'azione del modulo con una stringa di query contenente i dati del campo.

METTERE

Meno utilizzato e non supportato dalla maggior parte dei browser, PUT viene utilizzato per creare una nuova risorsa.

ELIMINA

Inoltre, non utilizzato da molti browser, questo verbo HTTP viene utilizzato piuttosto ovviamente per eliminare una risorsa.

Se lo inseriamo nel codice e autorizziamo ogni verbo sulla risorsa utente assomiglierebbe a questo:

 

Accesso ai parametri e restituzione dei dati

Così ora l'API è stata data la sua struttura impostando le risorse e definendo un metodo per ogni verbo HTTP che desideriamo supportare; abbiamo bisogno di parametri per poter usare i nostri modelli e librerie CodeIgniter. Questo è uno dei principali vantaggi dell'uso di CodeIgniter per la nostra API, in quanto possiamo utilizzare i nostri modelli e le nostre librerie esistenti e non doverli ricodificare.

get ( 'id')); $ This-> risposta ($ data);  function user_post () $ data = array ('restituito:'. $ this-> post ('id')); $ This-> risposta ($ data);  function user_put () $ data = array ('restituito:'. $ this-> put ('id')); $ this-> response ($ data; function user_delete () $ data = array ('restituito:'. $ this-> delete ('id')); $ this-> response ($ data);

Questo esempio contiene cinque nuove parti di codice:

$ This-> get ()

È usato per restituire le variabili GET da una stringa di query come questo index.php / example_api / user? Id = 1 o può essere impostato in modo più CodeIgniter'esque con index.php / example_api / user / id / 1.

$ This-> post ()

È un alias per $ this-> input-> post () che è il metodo di CodeIgniter per accedere alle variabili $ _POST con la protezione XSS.

$ This-> put ()

Legge gli argomenti PUT impostati nelle intestazioni HTTP o tramite cURL.

$ This-> delete ()

Avete indovinato, questo legge negli argomenti DELETE, anche nelle intestazioni HTTP o tramite cURL.

$ This-> risposta ()

Invia dati al browser in qualsiasi formato di dati richiesto o predefinito su XML. Puoi facoltativamente passare un codice di stato HTTP per mostrare che ha funzionato o fallito. E.g se l'ID fornito non era nel database, è possibile utilizzare $ this-> response (array ('error' => 'User not found.'), 404);

Step 4: Lavorare con i tuoi modelli

Fino ad ora, abbiamo lavorato con un'API di esempio in un'installazione pulita. Quindi il passo successivo è ottenere un'API REST in esecuzione dalla base di codice esistente.

Anche se il download viene fornito con un'installazione completa CodeIgniter per la demo e per consentire la creazione di API da zero, gli unici due file importanti sono:

  1. application / config / rest.php
  2. application / librerie / REST_Controller.php

Rilascia questi due file nell'applicazione CodeIgniter e crea un nuovo controller API.

get ('id')) $ this-> response (NULL, 400);  $ user = $ this-> user_model-> get ($ this-> get ('id')); se ($ utente) $ this-> risposta ($ utente, 200); // 200 è il codice di risposta HTTP else $ this-> response (NULL, 404);  function user_post () $ result = $ this-> user_model-> update ($ this-> post ('id'), array ('name' => $ this-> post ('name'), 'email '=> $ this-> post (' email '))); if ($ result === FALSE) $ this-> response (array ('status' => 'failed'));  else $ this-> response (array ('status' => 'success'));  function users_get () $ users = $ this-> user_model-> get_all (); se ($ utenti) $ this-> risposta ($ utenti, 200);  else $ this-> response (NULL, 404); ?>

Questo mostra un esempio di API con alcuni nomi di modelli generici. Nel primo metodo, prendiamo un? Id = XX e lo passiamo al modello. Se i dati vengono rilevati, li inviamo alla funzione $ this-> response () con lo stato 200. Se non viene trovato nulla, non restituire alcun corpo e un 404 per non rilevare nulla. Puoi immaginare come questo potrebbe essere espanso per eseguire tutti i tipi di attività API per la tua applicazione web.

Passaggio 5: protezione dell'API

Ora la tua API è costruita ha bisogno di essere protetta in modo che solo gli utenti che hanno accesso possano interagire con l'API. Per impostare il tipo di accesso, i nomi utente e le password si aprono "Application / config / rest.php" all'interno della base di codice.

/ * | ----------------------------------------------- --------------------------- | Login REST | ----------------------------------------------- --------------------------- | | È richiesto l'accesso e, in tal caso, quale tipo di accesso? | | "= nessun accesso richiesto, 'base' = accesso relativamente sicuro, 'digest' = login sicuro | * / $ config ['rest_auth'] = 'base';

Nessuna

Chiunque può interagire con uno qualsiasi dei tuoi controller API.

Di base

Un metodo di accesso relativamente insicuro che dovrebbe essere utilizzato solo su reti interne / sicure.

digerire

Un metodo di accesso molto più sicuro che crittografa i nomi utente e la password. Se desideri avere un'API protetta a cui chiunque possa accedere, usa digest.

/ * | ----------------------------------------------- --------------------------- | REST Login nomi utente | ---------------------------------------------- ---------------------------- | | Matrice di nomi utente e password per l'accesso | | array ('admin' => '1234') | * / $ config ['rest_valid_logins'] = array ('admin' => '1234');

La configurazione degli utenti è semplice. Ogni accesso è un elemento dell'array, con una chiave e un valore. La chiave è il nome utente e il valore è la password. Aggiungi quanti ne vuoi a questo array e distribuiscili a chiunque utilizzi l'API.

Parte 2 - Interagire con i servizi RESTful

Sia che si tratti dell'API appena creata o di un servizio pubblico come Twitter, vorrete essere in grado di interagire con esso in qualche modo. Visto che i servizi RESTful funzionano con le richieste HTTP di base, è molto facile farlo in molti modi diversi.

Metodi diversi per interagire con REST

Ognuno di questi diversi metodi di interazione verrà mostrato con il codice inserito direttamente nei metodi del controller. Questo è puramente quindi le demo sono più facili da leggere e normalmente verrebbero posizionate all'interno di un modello o di una libreria per la corretta separazione MVC.

file_get_contents ()

Usando la semplice funzione PHP file_get_contents (), puoi eseguire una richiesta GET di base. Questo è il più fondamentale di tutti i metodi, ma vale la pena menzionare per quei momenti "veloci e sporchi".

$ user = json_decode (file_get_contents ('http://example.com/index.php/api/user/id/1/format/json')); echo $ utente-> nome;

Vale la pena notare che, sebbene questo metodo non funzioni utilizzando l'autenticazione HTTP Digest, se si utilizza l'autenticazione HTTP Basic è possibile utilizzare la seguente sintassi per ottenere i dati dall'API RESTful protetta da password:

$ user = json_decode (file_get_contents ('http: // admin: [email protected]/index.php/api/user/id/1/format/json')); echo $ utente-> nome;

Ci sono alcuni problemi nell'usare questo metodo: l'unico modo per impostare intestazioni HTTP aggiuntive è impostarle manualmente usando la funzione PHP stream_context_create (), che può essere molto complicata per gli sviluppatori che sono nuovi al funzionamento interno delle richieste HTTP. Un altro svantaggio è che ricevi solo il corpo della risposta HTTP nel suo formato raw, il che significa che devi gestire la conversione da una singola richiesta.

arricciare

cURL è il modo più flessibile per interagire con un'API REST poiché è stata progettata proprio per questo genere di cose. È possibile impostare intestazioni HTTP, parametri HTTP e molto altro. Ecco un esempio di come aggiornare un utente con il nostro esempio_api e cURL per fare una richiesta POST:

 function native_curl ($ new_name, $ new_email) $ username = 'admin'; $ password = '1234'; // Alternative JSON version // $ url = 'http://twitter.com/statuses/update.json'; // Imposta ed esegue il processo di curl $ curl_handle = curl_init (); curl_setopt ($ curl_handle, CURLOPT_URL, 'http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); curl_setopt ($ curl_handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ curl_handle, CURLOPT_POST, 1); curl_setopt ($ curl_handle, CURLOPT_POSTFIELDS, array ('name' => $ new_name, 'email' => $ new_email)); // Facoltativo, elimina questa riga se la tua API è aperta curl_setopt ($ curl_handle, CURLOPT_USERPWD, $ username. ':'. $ Password); $ buffer = curl_exec ($ curl_handle); curl_close ($ curl_handle); $ result = json_decode ($ buffer); if (isset ($ result-> status) && $ result-> status == 'success') echo 'L'utente è stato aggiornato.';  else echo 'Qualcosa è andato storto'; 

Interagire con la tua API funziona in questo modo, ma ci sono due problemi con questo metodo:

  1. Usa una sintassi poco chiara e confusa: immagina di creare diverse applicazioni basate su questo.
  2. cURL non è installato su tutti i server per impostazione predefinita.

Per risolvere questa brutta sintassi, è stata sviluppata una libreria cURL per CodeIgniter che semplifica enormemente le cose.

La stessa esatta richiesta fatta con la libreria cURL sarebbe simile a questa:

 function ci_curl ($ new_name, $ new_email) $ username = 'admin'; $ password = '1234'; $ This-> load-> library ( 'ricciolo'); $ This-> curl-> creare ( 'http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); // Facoltativo, cancella questa riga se la tua API è aperta $ this-> curl-> http_login ($ username, $ password); $ this-> curl-> post (array ('name' => $ new_name, 'email' => $ new_email)); $ result = json_decode ($ this-> curl-> execute ()); if (isset ($ result-> status) && $ result-> status == 'success') echo 'L'utente è stato aggiornato.';  else echo 'Qualcosa è andato storto'; 

Molto più bello da guardare a destra? Bene, c'è un metodo ancora più semplice per lavorare con REST nelle tue applicazioni CodeIgniter che questo.

Libreria client REST

È stata sviluppata una libreria client REST che si trova sopra questa libreria cURL che gestisce la conversione del formato, i login HTTP e molti altri aspetti dell'API REST.

 function rest_client_example ($ id) $ this-> load-> library ('rest', array ('server' => 'http: //localhost/restserver/index.php/example_api/', 'http_user' => ' admin ',' http_pass '=>' 1234 ',' http_auth '=>' basic '// o' digest ')); $ user = $ this-> rest-> get ('user', array ('id' => $ id), 'json'); echo $ utente-> nome; 

Qui puoi vedere che stiamo facendo una richiesta GET, inviando id come parametro e dicendo alla biblioteca che vogliamo "json" come formato del contenuto. Questo gestisce l'impostazione del tipo di contenuto per te e converte i dati in un oggetto PHP per te. Puoi cambiare questo valore in "xml", "json", "serialize", "php", "csv" o qualsiasi tipo MIME personalizzato che ti piace, ad esempio:

 $ user = $ this-> rest-> get ('user', array ('id' => $ id), 'application / json');

Come probabilmente hai indovinato oltre a $ this-> rest-> get (), la libreria supporta anche $ this-> rest-> post (), $ this-> rest-> put (), $ this-> rest -> delete () per abbinare tutti i metodi REST_Controller.

Avrai bisogno di var_dump () risultati provenienti dalla libreria client REST per assicurarti che stai ricevendo il giusto formato dati. Talvolta la conversione sarà array e talvolta sarà un oggetto, a seconda di come viene convertito da PHP. Se il tipo MIME restituito non è supportato, restituirà semplicemente il formato come testo normale.

Parlando con Twitter

Usando questa libreria REST puoi parlare con altri servizi RESTful come Twitter e Facebook. Ecco un semplice esempio di come è possibile ottenere i dettagli per un utente specifico in base al proprio ID, utilizzando il formato XML predefinito di Twitter.

 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/')); $ user = $ this-> rest-> get ('users / show', array ('screen_name' => 'philsturgeon'));
 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/', 'http_user' => 'username', 'http_pass' => 'password', ' http_auth '=>' basic ')); $ user = $ this-> rest-> post ('statuses / update.json', array ('status' => 'Uso del client REST per fare cose'));

Guardando questo, noterai che interagire con l'API di Twitter è un po 'diverso in alcuni modi.

  1. Supportano il cambio formato basato su URL sotto forma di .json invece di / format / json. Alcuni richiedono un'estensione, altri no; quindi è sempre meglio aggiungerli.
  2. Solitamente supportano solo GET / POST, ma stanno iniziando ad aggiungere più metodi DELETE
  3. Non sempre hanno solo una risorsa nel loro URL, ad esempio: gli utenti / Ricerca è un metodo REST, ma liste è un altro.

Tieni d'occhio queste differenze perché riescono a catturarti. Se ti blocchi, semplicemente echo $ this-> rest-> debug () per un'intera gamma di informazioni sulla tua richiesta REST.

Sommario

Combinando ciò che ora sai sui servizi RESTful, la libreria client REST CodeIgniter e la documentazione API di Twitter - o qualsiasi altra documentazione API RESTful per quella materia - puoi creare alcune applicazioni molto potenti che si integrano con qualsiasi servizio web pubblico o personalizzato usando REST. Puoi estendere la tua API creando più REST_Controller e persino creare un'API modulare utilizzando Matchbox o Separazione modulare per creare un controller api.php per ciascun modulo per mantenere la tua API ben organizzata come la tua applicazione.

Seguici su Twitter o iscriviti al feed Nettuts + RSS per i migliori tutorial di sviluppo web sul web. E non dimenticare di dare un'occhiata agli utili script e app CodeIgniter su Envato Market.