Lucrul cu serviciile RESTful în CodeIgniter

CodeIgniter devine bine cunoscut pentru puterea sa ca cadru de aplicații web bazat pe PHP, dar nu este adesea faptul că vedem exemple de utilizare a acestuia pentru orice altceva. Astăzi vom afla cum putem folosi CodeIgniter pentru a crea un API RESTful pentru aplicațiile dvs. web existente și pentru a demonstra cum să interacționezi cu API-ul tău sau cu alte servicii web de tip RESTful, cum ar fi Facebook și Twitter.

După cum probabil știți, puteți găsi o gamă largă de scripturi și aplicații CodeIgniter pe Envato Market, de la scripturile de membru la managerii de meniuri și multe altele.

Detalii tutoriale

  • Program: CodeIgniter, serverul CodeIgniter REST și clientul CodeIgniter REST
  • Dificultate: Mediu
  • Durata estimată de finalizare: 30 minute

Introducere

Dacă ați urmat CodeIgniter de la zero , veți cunoaște până acum că este relativ rapid și ușor de realizat aplicații web simple, cum ar fi bloguri, sisteme CMS, site-uri de broșuri etc. Un lucru pe care probabil că nu l-ați gândit este să utilizați CodeIgniter pentru a crea un API interactiv. După ce am încercat mai multe implementări REST existente, am constatat că acestea nu numai că nu aveau simplitate, dar lipseau majoritatea caracteristicilor pe care le-ați aștepta de la o implementare RESTful; așa că am construit propria mea. Acest tutorial vă va arăta cum să utilizați acest cod pentru a configura API-ul REST și vă oferă un exemplu de interacțiune cu acesta din aplicația dvs. web.

Ipoteze

  1. Aveți un server web configurat, local sau online, și este cunoscut modul de gestionare a fișierelor de pe acesta.
  2. Ați citit câteva din codurile de scriere CodeIgniter de la Scratch.
  3. Știți cum să configurați CodeIgniter.
  4. Știi ceva despre serviciile RESTful.

Acest tutorial este împărțit în două părți. Vom începe prin a învăța cum să creăm un serviciu RESTful, apoi mai jos, vom învăța cum să interacționăm cu el în câteva moduri diferite.

Partea 1 - Crearea unui API RESTful

Pasul 1: Configurarea Demo-ului

În primul rând, trebuie să descărcați codul codeigniter-restserver de la GitHub și să îl extrageți și să mutați codul pe server.

Când deschideți dosarul, veți vedea o întreagă instalare CodeIgniter, care este acolo pentru a activa demo-ul. Acest lucru permite oamenilor să aibă un joc cu demonstrația REST înainte de a se integra cu aplicația dvs. existentă.

Deschide "Application / config / config.php" și setați base_url pentru a obține link-uri de lucru. Această bază_url va fi diferită pentru toată lumea și depinde în întregime de locul în care ați încărcat fișierele.

Pasul 2: Adresele URL

Cu fișierele extrase și setul base_url, suntem gata să încărcăm instalarea noastră de RESTful CodeIgniter și să aruncăm o privire la demo-ul livrat împreună cu acesta. Răsfoiți adresa URL de bază, care în mod implicit este:

http: // localhost / restserver

Aici veți găsi câteva exemple de linkuri către example_api controler, care poate fi găsit la "Application / controlere / example_api.php". Să examinăm URL-ul acestor exemple pentru a vedea ce se întâmplă. Primul URL este unul foarte simplu.

Această adresă URL seamănă ca orice altă adresă URL CodeIgniter cu un controler și o metodă, dar veți observa în această diagramă că metoda este denumită "Resursă". REST este vorba de Resurse și sunt, în esență, un substantiv în cadrul aplicației dvs., care sunt interacționate cu (adică, adăugate, șterse, editate, interogate) pe baza antetelor HTTP și a șirurilor de interogări URL sau a argumentelor HTTP.

Formatul implicit pentru ieșire este XML, ceea ce vedem în acest exemplu de bază. Celelalte linkuri sunt puțin mai mari și demonstrează cum se transmit parametrii și arată modul în care formatul de ieșire poate fi modificat în URL:

În mod normal, în CodeIgniter, trebuie doar să treceți valorile parametrilor, dar un controler REST acceptă orice număr de parametri în orice ordine. Pentru ca aceasta să funcționeze, trebuie să trecem în numele parametrului urmat de valoare în perechi.

La sfârșitul adresei URL este parametrul "format". Acesta este un parametru rezervat care va modifica formatul de ieșire al datelor solicitate, cum ar fi:

Oferind atât dezvoltatorului API, cât și aplicației client alegerea formatelor de date pe care le utilizează, API-ul este deschis pentru o audiență mult mai largă și poate fi utilizat cu mai multe limbi și sisteme de programare. Aceste trei nu sunt singurele formate acceptate, din caseta pe care poate să o utilizeze API-ul REST:

  • xml - aproape orice limbaj de programare poate citi XML
  • JSON - util pentru JavaScript și aplicații din ce în ce PHP.
  • csv - deschideți cu programe de calcul tabelar
  • html - un simplu tabel HTML
  • php - Reprezentarea codului PHP care poate fi eval () ed
  • serializa - Date seriale care pot fi neserializate în PHP

În timp ce adăugarea formatului la adresa URL nu este din punct de vedere tehnic calea cea mai REST pentru a schimba formatele, permite o testare ușoară a browserului și permite dezvoltatorilor fără cURL să efectueze cereri GET simple pe API. Cea mai raspandita cale este de a trimite o Tipul de conținut Antet HTTP la controlerul REST folosind cURL, dar care va fi explicat mai târziu.

Pasul 3: Codul

Acum, dacă te deschizi application / controllere / example_api.php veți observa imediat câteva diferențe de la controlorii normali CodeIgniter.

REST_Controller

În modelul MVC, un controler este punctul central al logicii. Se numește atunci când un utilizator face o cerere și apoi, pe baza logicii din controler, prelucrează vizualizările de date și de ieșiri. CodeIgniter conține logica proprie pentru modul în care un controlor ar trebui să funcționeze, dar pe măsură ce facem ceva diferit, avem nevoie de propria noastră bibliotecă REST_Controller pentru a conține propria logică REST. Deci, în loc să folosiți pur și simplu:

 

... va trebui să utilizați:

 

Lucrul cu resursele

Acum este setat controlerul gol, urmatoarele metode sau "resurse". Aceasta este cea mai confuză parte a tutorialului, dacă sunteți obișnuiți cu modul în care funcționează CodeIgniter. Practic, luați verbul Resursă și HTTP și combinați-le pentru a face un nume de metodă. Deci, cele două exemple la care ne-am uitat înainte au avut o resursă utilizator și utilizatori. Deoarece ambele au fost încărcate în browser, știm că a fost folosită o solicitare GET și astfel sunt utilizate cele două metode de mai jos:

 

Acest lucru poate părea puțin ciudat, dar vă oferă posibilitatea de a utiliza aceeași adresă URL și de a răspunde solicitării în funcție de verbul HTTP utilizat. Dacă cineva încearcă să acceseze API-ul într-un mod care nu este permis (în acest exemplu PUT sau DELETE), acesta va răspunde pur și simplu cu un 404. Dacă nu sunteți sigur de verbele HTTP, permiteți-mi să explic.

OBȚINE

Folosit pentru a obține informații despre o resursă existentă. Acest lucru este folosit de browsere atunci când introduceți o adresă URL și faceți clic pe butonul sau când faceți clic pe un link, astfel încât acesta este perfect pentru a obține informații despre una din resursele dvs. REST (cum ar fi utilizatorul).

POST

Folosit pentru a actualiza o resursă existentă cu informații. Utilizatorii browserului utilizează acest lucru pentru a trimite cele mai multe tipuri de formulare pe internet, deși unii folosesc și GET prin trimiterea acțiunii formularului cu un șir de interogare care conține datele câmpului.

A PUNE

Mai puțin frecvent utilizat și neacceptat de majoritatea browserelor, PUT este folosit pentru a crea o nouă resursă.

ȘTERGE

De asemenea, nu este utilizat de mai multe browsere, acest verb HTTP este, evident, utilizat pentru a șterge o resursă.

Dacă îl punem în cod și permitem fiecare verb al resurselor utilizator ar arata astfel:

 

Accesarea parametrilor și returnarea datelor

Așadar, API a dat structura sa prin crearea resurselor și definirea unei metode pentru fiecare verb HTTP pe care dorim să-l susținem; avem nevoie de parametri pentru a putea folosi modelele și bibliotecile noastre CodeIgniter. Acesta este unul dintre beneficiile majore ale utilizării CodeIgniter pentru API-ul nostru, deoarece putem folosi modelele și bibliotecile existente și nu trebuie să le re-codăm.

get ( 'id')); $ This-> răspuns ($ date);  funcția user_post () $ data = array ('return:'. $ this-> post ('id')); $ This-> răspuns ($ date);  funcția user_put () $ data = array ('return:'. $ this-> put ('id')); $ this-> răspuns ($ date; funcția user_delete () $ data = array ('return:'. $ this-> delete ('id'));

Acest exemplu conține cinci noi bucăți de cod:

$ This-> get ()

Se utilizează pentru a returna variabilele GET fie dintr-un șir de interogări ca acest index.php / example_api / user? Id = 1, fie poate fi setat în mai multe moduri CodeIgniter'esque cu index.php / example_api / user / id / 1.

$ This-> post ()

Este un alias pentru $ this-> input-> post () care este metoda CodeIgniter pentru a accesa variabilele $ _POST cu protectie XSS.

$ This-> pune ()

Citește în argumente PUT setate în anteturile HTTP sau prin cURL.

$ This-> șterge ()

Ați ghicit-o, acest lucru se citește în argumentele DELETE, setate și în antetele HTTP sau prin cURL.

$ This-> răspuns ()

Trimite date către browser în orice format de date a fost solicitat sau implicit la XML. Puteți trece opțional un cod de stare HTTP pentru a arăta că a funcționat sau a eșuat. De exemplu, dacă ID-ul furnizat nu era în baza de date, ați putea folosi $ this-> reply (array ('error' => 'Utilizatorul nu a fost găsit'), 404);

Pasul 4: Lucrul cu modelele tale

Până acum, am lucrat cu un exemplu de API într-o instalare curată. Deci, următorul pas este să obțineți un API REST care rulează de la codul dumneavoastră existent.

Deși descărcarea vine cu o instalare completă CodeIgniter pentru demo și pentru a permite ca API-urile să fie construite de la zero, singurele două fișiere importante sunt:

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

Aruncați cele două fișiere în aplicația CodeIgniter și creați un nou controler API.

primi ('id')) $ this-> răspuns (NULL, 400);  $ user = $ this-> user_model-> obține ($ this-> get ('id')); dacă ($ user) $ this-> răspuns ($ user, 200); // 200 fiind codul de răspuns HTTP altceva $ this-> response (NULL, 404);  funcția user_post () $ rezultat = $ this-> user_model-> actualizare ($ this-> post ('id'), array '=> $ this-> post (' e-mail '))); dacă ($ rezultat === FALSE) $ this-> răspuns (array ('status' => 'eșuat'));  altceva $ this-> răspuns (array ('status' => 'succes'));  funcția users_get () $ users = $ this-> user_model-> get_all (); dacă ($ users) $ this-> response ($ users, 200);  altceva $ this-> response (NULL, 404); ?>

Acesta arată un exemplu API cu câteva nume de model generic. În prima metodă, luăm un id = XX și îl transmitem modelului. În cazul în care se găsesc date, o trimitem la funcția $ this-> response () cu o stare 200. Dacă nu se găsește nimic, nu se întoarce nici un corp și nu sa găsit 404 pentru a spune nimic. Vă puteți imagina cum acest lucru ar putea fi extins pentru a rula tot felul de activități API pentru aplicația dvs. web.

Pasul 5: Asigurarea API-ului

Acum, API-ul dvs. este construit și are nevoie de securizare, astfel încât numai utilizatorii care au acces pot interacționa cu API-ul. Pentru a seta tipul de conectare, numele de utilizator și parolele se deschid "Application / config / rest.php" în baza de cod.

/ * | ----------------------------------------------- --------------------------- REST Conectare | ----------------------------------------------- --------------------------- | Este necesară autentificarea și, dacă da, ce tip de login? | | = = nu este nevoie de autentificare, 'basic' = login relativ sigur, 'digest' = autentificare sigură | * / $ config ['rest_auth'] = 'basic';

Nici unul

Oricine poate interacționa cu oricare dintre controlerele dvs. API.

De bază

O metodă de autentificare relativ nesigură, care ar trebui utilizată numai pe rețelele interne / securizate.

Digera

O metodă de conectare mult mai sigură, care criptează numele de utilizator și parola. Dacă doriți să aveți un API protejat la care oricine ar putea ajunge, utilizați digestul.

/ * | ----------------------------------------------- --------------------------- REST Login user names | ---------------------------------------------- ---------------------------- | | Gamă de nume de utilizator și parole pentru autentificare | | array ('admin' => '1234') * / $ config ['rest_valid_logins'] = array ('admin' => '1234');

Configurarea utilizatorilor este simplă. Fiecare autentificare este un element de matrice, cu o cheie și o valoare. Cheia este numele de utilizator și valoarea este parola. Adăugați cât de mult vă place la această matrice și spălați-le tuturor celor care vor folosi API-ul.

Partea 2 - Interacțiunea cu serviciile RESTful

Fie că este vorba despre API pe care tocmai l-ați construit sau despre un serviciu public, cum ar fi Twitter, veți dori să fiți capabil să interacționați cu el într-un fel. Văzând că serviciile RESTful funcționează cu cereri de bază de HTTP, este foarte ușor să faceți acest lucru în mai multe moduri diferite.

Diferite metode de interacțiune cu REST

Fiecare dintre aceste metode diferite de interacțiune va fi afișată cu codul plasat direct în metodele Controller. Acest lucru este pur și simplu astfel încât demo-urile sunt mai ușor de citit și în mod normal ar fi plasate în interiorul unui model sau într-o bibliotecă pentru separarea corectă a MVC.

file_get_contents ()

Folosind funcția foarte simplă PHP file_get_contents (), puteți efectua o solicitare GET de bază. Aceasta este cea mai de bază dintre toate metodele, dar merită menționată pentru acele momente "rapide și murdare".

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

Merită să observăm că, deși această metodă nu va funcționa utilizând autentificarea HTTP Digest, dacă utilizați autentificarea de bază HTTP, puteți utiliza următoarea sintaxă pentru a obține date din API RESTful API protejat prin parolă:

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

Există câteva probleme cu utilizarea acestei metode: singura modalitate de a seta antete HTTP suplimentare este să le setați manual utilizând funcția PHP stream_context_create (), care poate fi foarte complicată pentru dezvoltatorii care sunt noi în procesarea internă a cererilor HTTP. Un alt dezavantaj este că primiți doar corpul răspunsului HTTP în formatul său brut, ceea ce înseamnă că trebuie să gestionați conversia dintr-o singură cerere.

răsuci

cURL este cel mai flexibil mod de a interacționa cu un API REST deoarece a fost proiectat pentru exact acest tip de lucru. Puteți seta anteturile HTTP, parametrii HTTP și multe altele. Iată un exemplu de actualizare a unui utilizator cu exemplele noastre example_api și cURL pentru a face o solicitare POST:

 funcția native_curl ($ new_name, $ new_email) $ username = 'admin'; $ password = '1234'; // Versiune alternativă JSON // $ url = 'http://twitter.com/statuses/update.json'; // Configurați și executați procesul de 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 ('nume' => $ new_name, 'email' => $ new_email)); // Opțional, ștergeți această linie dacă API este curl_setopt deschis ($ curl_handle, CURLOPT_USERPWD, $ username. ':'. $ Password); $ buffer = curl_exec ($ curl_handle); curl_close ($ curl_handle); $ rezultat = json_decode ($ buffer); dacă (isset ($ result-> status) && $ result-> status == 'succes') echo 'Utilizatorul a fost actualizat.';  altceva echo 'Ceva a mers prost; 

Interacționarea cu API-ul dvs. funcționează bine, dar există două probleme cu această metodă:

  1. Utilizează o sintaxă urâtă confuză - imaginați-vă că ați creat mai multe aplicații bazate pe aceasta.
  2. cURL nu este instalat pe toate serverele în mod implicit.

Pentru a rezolva această sintaxă urâtă, a fost creată o bibliotecă cURL pentru CodeIgniter, care simplifică foarte mult lucrurile.

Aceeași solicitare făcută cu biblioteca cURL ar arăta astfel:

 funcția ci_curl ($ new_name, $ new_email) $ username = 'admin'; $ password = '1234'; $ This-> a sarcinii> bibliotecă ( 'curl'); $ This-> curl-> crea ( 'http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); // Opțional, ștergeți această linie dacă API-ul dvs. este deschis $ this-> curl-> http_login ($ username, $ password); $ this-> curl-> post (array ('nume' => $ new_name, 'email' => $ new_email)); $ result = json_decode ($ această-> curl-> execute ()); dacă (isset ($ result-> status) && $ result-> status == 'succes') echo 'Utilizatorul a fost actualizat.';  altceva echo 'Ceva a mers prost; 

Mult mai plăcut să te uiți la bine? Ei bine, există o metodă și mai ușoară de a lucra cu aplicația REST în aplicațiile CodeIgniter.

REST biblioteca client

A fost creată o bibliotecă client REST care se află pe partea superioară a acestei biblioteci cURL care gestionează conversia formatelor, conectările HTTP și câteva alte aspecte ale API-ului dvs. REST.

 funcția 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 '=>' bază '// sau' digest ')); $ user = $ this-> rest-> get ('utilizator', array ('id' => $ id), 'json'); echo $ user-> name; 

Aici puteți vedea că facem o solicitare GET, trimitem id-ul ca parametru și spunem bibliotecii că dorim "json" ca format de conținut. Aceasta gestionează setarea tipului de conținut pentru dvs. și transformă datele într-un obiect PHP pentru dvs. Puteți modifica această valoare la "xml", "json", "serialize", "php", "csv" sau orice tip MIME personalizat dorit, de exemplu:

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

După cum probabil ați ghicit și $ this-> rest-> get (), biblioteca susține și $ this-> rest-> post (), $ this-> rest-> put (), $ this-> rest -> delete () pentru a se potrivi cu toate metodele dvs. REST_Controller.

Veți avea nevoie de rezultatele var_dump () provenite de la biblioteca clientului REST pentru a vă asigura că obțineți corect formatul de date înapoi. Conversia va fi uneori matrice și uneori un obiect, în funcție de modul în care este convertit de PHP. Dacă tipul MIME returnat nu este acceptat, atunci acesta va returna pur și simplu formatul ca text simplu.

Vorbind cu Twitter

Folosind această bibliotecă REST poți să vorbești și cu alte servicii RESTful precum Twitter și Facebook. Iată un exemplu simplu despre modul în care puteți obține detalii pentru un utilizator specific pe baza codului său de identificare, utilizând formatul XML implicit al formularului Twitter.

 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/')); $ user = $ this-> rest-> get ("utilizatori / show", array ('screen_name' => 'philsturgeon'));
 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/', 'http_user' => 'username', 'http_pass' http_auth '=>' bază ')); $ user = $ this-> rest-> post ('statuses / update.json', array ('status' => 'Utilizarea clientului REST pentru a face lucruri'));

Privind la acest lucru, veți observa că interacțiunea cu API-ul Twitter este puțin diferită în câteva moduri.

  1. Acestea suportă comutarea formatelor bazate pe URL în formă de .json în loc de / format / json. Unele necesită o prelungire, altele nu; astfel încât este mai bine să le adăugați întotdeauna.
  2. În general, acestea acceptă numai GET / POST, dar au început să adauge mai multe metode DELETE
  3. Ele nu au întotdeauna doar o resursă în URL-ul lor, de exemplu: utilizatorii / căutare este o metodă REST, dar liste este alta.

Fii atent la aceste diferențe, deoarece te pot prinde. Dacă rămâneți blocat, purtați simplu $ this-> rest-> debug () pentru o întreagă gamă de informații despre cererea dvs. REST.

rezumat

Combinând ceea ce știți acum despre serviciile RESTful, biblioteca clientului CodeIgniter REST și documentația API-ului Twitter sau orice altă documentație API RESTful, puteți crea câteva aplicații foarte puternice care se integrează cu orice serviciu personalizat sau public web care utilizează REST. Puteți extinde API-ul dvs. prin crearea mai multor REST_Controller și chiar a crea un API modular utilizând Matchbox sau Separarea modulară pentru a crea un controler api.php pentru fiecare modul, pentru a vă ajuta să păstrați API-ul într-un mod bine organizat ca aplicația dvs..

Urmați-ne pe Twitter sau abonați la Nettuts + RSS Feed pentru cele mai bune tutoriale de dezvoltare web de pe web. Și nu uitați să verificați scripturile și aplicațiile CodeIgniter utile pe Envato Market.

Cod