Hypertext Transfer Protocol (HTTP) este viața web-ului. Este folosit de fiecare dată când transferați un document sau faceți un document AJAX
cerere. Dar HTTP este surprinzător de relativ necunoscut printre anumiți dezvoltatori web.
Această introducere va demonstra modul în care setul de principii de proiectare, cunoscut sub numele de REST, sprijină HTTP și vă permite să îmbrățișați puterea maximă prin construirea de interfețe care pot fi utilizate de la aproape orice dispozitiv sau sistem de operare.
Envato Market are, de asemenea, mii de script-uri de coduri utile, pluginuri și aplicații care vă ajută în dezvoltarea web-ului, cum ar fi HTTP Assistant, o aplicație care vă ajută să testați serviciile web online.
Aplicația HTTP Assistant de pe Envato Market Tutorial publicatLa fiecare câteva săptămâni, revizuim câteva postări preferate ale cititorilor noștri de-a lungul istoriei site-ului. Acest tutorial a fost publicat pentru prima oară în noiembrie 2010.
REST este o modalitate simplă de a organiza interacțiuni între sisteme independente.
REST este o modalitate simplă de a organiza interacțiuni între sisteme independente. Este în creștere în popularitate din 2005, și inspiră designul de servicii, cum ar fi Twitter API. Acest lucru se datorează faptului că REST vă permite să interacționați cu costuri minime cu clienți la fel de diverse ca telefoanele mobile și alte site-uri Web. Teoretic, REST nu este legat de web, dar este aproape întotdeauna implementat ca atare și a fost inspirat de HTTP. Ca rezultat, REST poate fi folosit oriunde poate HTTP.
Alternativa constă în construirea unor convenții relativ complexe în partea de sus a HTTP. Adesea, aceasta are forma unor noi limbi bazate pe XML. Cel mai ilustru exemplu este SOAP. Trebuie să învățați un set complet de convenții complet noi, dar nu utilizați niciodată HTTP la puterea maximă. Deoarece REST a fost inspirat de HTTP și se joacă la punctele sale forte, este cel mai bun mod de a afla cum funcționează HTTP.
După o primă prezentare generală, vom examina fiecare dintre blocurile de construcție HTTP: adrese URL, verbale HTTP și coduri de răspuns. Vom examina, de asemenea, cum să le folosim într-un mod RESTful. Pe parcurs, vom ilustra teoria cu o aplicație de exemplu, care simulează procesul de urmărire a datelor referitoare la clienții unei companii printr-o interfață web.
HTTP este protocolul care permite trimiterea de documente înapoi și înapoi pe web.
HTTP este protocolul care permite trimiterea de documente înapoi și înapoi pe web. Un protocol este un set de reguli care determină ce mesaje pot fi schimbate și care sunt răspunsurile potrivite altora. Un alt protocol comun este POP3, pe care îl puteți folosi pentru a prelua e-mailurile de pe hard disk.
În HTTP, există două roluri diferite: server și client. În general, clientul inițiază întotdeauna conversația; serverul răspunde. HTTP este bazat pe text; adică mesajele sunt în esență biți de text, deși corpul mesajului poate conține și alte medii. Utilizarea textului ușurează monitorizarea unui schimb HTTP.
Mesajele HTTP sunt realizate dintr-un antet și un corp. Corpul poate rămâne adesea gol; conține date pe care doriți să le transmiteți prin rețea, pentru a le utiliza în conformitate cu instrucțiunile din antet. Antetul conține metadate, cum ar fi informațiile de codificare; dar, în cazul unei cereri, conține, de asemenea, metodele importante HTTP. În stilul REST, veți observa că datele antetului sunt adesea mai importante decât corpul.
Dacă utilizați Instrumente de dezvoltare Chrome sau Firefox cu extensia Firebug instalată, faceți clic pe Net
panou, și setați-l la activat
. Apoi, veți avea posibilitatea de a vizualiza detaliile cererilor HTTP pe măsură ce navigați. De exemplu:
Un alt mod de a vă familiariza cu HTTP este să utilizați un client dedicat, cum ar fi cURL.
cURL este un instrument de linie de comandă disponibil pe toate sistemele de operare importante.
După ce ați instalat cURL, tastați:
curl -v google.com
Aceasta va afișa conversația HTTP completă. Cererile sunt precedate de >
, în timp ce răspunsurile sunt precedate <
.
Adresele URL sunt modul în care identificați lucrurile pe care doriți să lucrați. Spunem că fiecare adresă URL identifică o resursă. Acestea sunt exact aceleași adrese URL care sunt atribuite paginilor web. De fapt, o pagină web este un tip de resursă. Să luăm un exemplu mai exotic și să luăm în considerare exemplul nostru de aplicare, care gestionează lista clienților unei companii:
/ clienți
va identifica toți clienții, în timp ce
/ Clienti / jim
va identifica clientul, numit "Jim", presupunând că el este singurul cu acest nume.
În aceste exemple, în general, nu includeți numele de gazdă în adresa URL, deoarece este irelevant din punctul de vedere al modului în care este organizată interfața. Cu toate acestea, numele gazdei este important să se asigure că identificatorul de resurse este unic pe întregul web. Adesea spunem că trimiteți solicitarea pentru o resursă la o gazda. Gazda este inclusă în antet separat de calea de resurse, care se află chiar în partea de sus a antetului solicitării:
GET / clienți / jim HTTP / 1.1 Host: example.com
Resursele sunt cel mai bine gândite ca substantive. De exemplu, următoarele nu sunt RESTful:
/ clienti / add
Acest lucru se datorează faptului că utilizează o adresă URL pentru a descrie o acțiune. Acesta este un punct destul de fundamental în diferențierea RESTful de sistemele non-RESTful.
În cele din urmă, adresele URL ar trebui să fie cât mai precise; tot ceea ce este necesar pentru a identifica în mod unic o resursă ar trebui să fie în adresa URL. Nu trebuie să includeți datele care identifică resursa în cerere. În acest fel, adresele URL funcționează ca o hartă completă a tuturor datelor preluate de aplicație.
Dar cum specificați o acțiune? De exemplu, cum îți dai seama că vrei să fie creat un nou dosar client în loc să fie recuperat? Aici se vorbește verbele HTTP.
Fiecare solicitare specifică un anumit verb HTTP, sau o metodă, în antetul solicitării. Acesta este primul cuvânt cu toate capacele din antetul solicitării. De exemplu,
GET / HTTP / 1.1
înseamnă că metoda GET este utilizată în timp ce
DELETE / clienți / ante HTTP / 1.1
înseamnă ȘTERGE
metoda este utilizată.
Verbul HTTP indică serverului ce trebuie să facă cu datele identificate de adresa URL.
Verbul HTTP indică serverului ce trebuie să facă cu datele identificate de adresa URL. Cererea poate conține opțional informații suplimentare în corpul său, care ar putea fi necesare pentru a efectua operația - de exemplu, datele pe care doriți să le stocați împreună cu resursa. Puteți furniza aceste date în cURL cu -d
opțiune.
Dacă ați creat vreodată formulare HTML, veți fi familiarizați cu două dintre cele mai importante verbe HTTP: OBȚINE
și POST
. Dar sunt disponibile mult mai multe verbe HTTP. Cele mai importante pentru construirea API-ului RESTful sunt OBȚINE
, POST
, A PUNE
și ȘTERGE
. Alte metode sunt disponibile, cum ar fi CAP
și OPȚIUNI
, dar acestea sunt mai rare (dacă doriți să aflați despre toate celelalte metode HTTP, sursa oficială este IETF).
OBȚINE
este cel mai simplu tip de metoda HTTP; cea utilizată de browsere de fiecare dată când faceți clic pe un link sau introduceți o adresă URL în bara de adrese. Acesta instruiește serverul să transmită clientului datele identificate prin URL. Datele nu ar trebui niciodată modificate pe partea de server ca urmare a unui OBȚINE
cerere. În acest sens, a OBȚINE
cererea este numai pentru citire, dar, desigur, odată ce clientul primește datele, este liber să facă orice operațiune cu acesta pe partea sa proprie - de exemplu, formatați-l pentru afișare.
A A PUNE
solicitarea este utilizată atunci când doriți să creați sau să actualizați resursa identificată prin adresa URL. De exemplu,
PUT / clienți / robin
ar putea crea un client, numit prihor
pe server. Veți observa asta ODIHNĂ
este complet agnostic; nu există nimic în cerere care să informeze serverul cum ar trebui să fie create datele - doar că ar trebui. Acest lucru vă permite să schimbați cu ușurință tehnologia backend în cazul în care ar trebui să apară. A PUNE
cererile conțin datele care trebuie utilizate în actualizarea sau crearea resursei în corp. În cURL, puteți adăuga date la cerere împreună cu -d
intrerupator.
curl -v -X PUT -d "un text"
ȘTERGE
ar trebui să facă contrariul A PUNE
; ar trebui să fie utilizat atunci când doriți să ștergeți resursa identificată prin adresa URL a solicitării.
curl -v -X DELETE / clienți / anne
Aceasta va șterge toate datele asociate resurselor, identificate prin / Clienti / anne
.
POST
este utilizat atunci când procesul de procesare pe care doriți să se întâmple pe server ar trebui să fie repetate, în cazul în care POST
cererea este repetată (adică nu sunt idempotente; mai mult pe cele de mai jos). în plus, POST
cererile ar trebui să determine prelucrarea organului de solicitare ca fiind subordonat adresei URL la care trimiteți.
Cuvintele simple:
POST / clienți /
nu ar trebui să provoace resursa la / clienti /
, ea însăși, să fie modificată, ci o resursă al cărei URL incepe cu /clienti /
. De exemplu, ar putea adăuga un nou client la listă, cu un id
generate de server.
/ Clienti / unele-id-ul unic
A PUNE
solicitările sunt folosite cu ușurință în loc de POST
solicitări și invers. Unele sisteme utilizează doar o singură utilizare POST
pentru operațiunile de creare și A PUNE
pentru operațiile de actualizare (deoarece cu A PUNE
vă rugăm să furnizați întotdeauna adresa URL completă), unele chiar utilizați POST
pentru actualizări și A PUNE
pentru creează.
De multe ori, POST
cererile sunt utilizate pentru a declanșa operațiuni pe server, care nu se încadrează în Creare / actualizare / Ștergere
paradigmă; dar acest lucru, cu toate acestea, este dincolo de sfera de aplicare a ODIHNĂ
. În exemplul nostru, ne vom ocupa A PUNE
tot drumul.
OBȚINE
. Celelalte sunt nesigure, deoarece pot duce la o modificare a resurselor. Metode Idempotent: Aceste metode ating același rezultat, indiferent de câte ori se repetă solicitarea: acestea sunt OBȚINE
, A PUNE
, și ȘTERGE
. Singura metodă non-idempotentă este POST
. A PUNE
și ȘTERGE
fiind considerat un idempotent ar putea fi surprinzător, deși, de fapt, este destul de ușor de explicat: repetând a A PUNE
metoda cu exact același organism ar trebui să modifice o resursă într-un mod care să rămână identic cu cel descris în precedent A PUNE
cerere: nimic nu se va schimba! În mod similar, nu are sens să ștergeți o resursă de două ori. Rezultă că, indiferent de câte ori a A PUNE
sau ȘTERGE
cererea se repetă, rezultatul ar trebui să fie același ca și cum ar fi fost făcut doar o singură dată. Tine minte: tu esti, programatorul, care decide in cele din urma ce se intampla cand se utilizeaza o anumita metoda HTTP. Nu există nimic inerent pentru implementările HTTP care vor determina automat crearea, afișarea, ștergerea sau actualizarea resurselor. Trebuie să aveți grijă să aplicați corect protocolul HTTP și să aplicați singuri aceste semantici.
Clientul HTTP și serverul HTTP schimbă informații despre resursele identificate prin adresele URL.
Putem rezuma ceea ce am învățat până acum în felul următor: clientul HTTP și serverul HTTP schimbă informații despre resursele identificate prin adresele URL.
Spunem că cererea și răspunsul conțin o reprezentare a resursei. Prin reprezentare, înțelegem informațiile, într-un anumit format, despre starea resurselor sau cum ar trebui să fie acel stat în viitor. Atât antetul, cât și corpul sunt părți ale reprezentării.
Antetele HTTP, care conțin metadate, sunt bine definite de spec. HTTP; ele pot conține numai text simplu și trebuie formatate într-o anumită manieră.
Organismul poate conține date în orice format, iar acesta este locul în care puterea HTTP strălucește cu adevărat. Știți că puteți trimite text simplu, imagini, HTML și XML în orice limbă umană. Prin metadate de solicitare sau prin diferite adrese URL, puteți alege între diferite reprezentări pentru aceeași resursă. De exemplu, este posibil să trimiteți o pagină Web către browsere și JSON către aplicații.
Răspunsul HTTP trebuie să specifice tipul de conținut al corpului. Acest lucru se face în antet, în Tipul de conținut camp; de exemplu:
Conținut / Tip: aplicație / json
Pentru simplitate, aplicația noastră de exemplu trimite numai JSON înainte și înapoi, dar aplicația ar trebui să fie arhitectonizată astfel încât să puteți schimba cu ușurință formatul datelor, să adaptați diferitele clienți sau preferințele utilizatorilor.
cURL este, deseori, soluția client HTTP de alegere pentru dezvoltatorii PHP.
Pentru a experimenta diferitele metode de solicitare, aveți nevoie de un client, care vă permite să specificați ce metodă să utilizați. Din păcate, formularele HTML nu se încadrează în proiectul de lege, deoarece vă permit doar să faceți cereri GET și POST. În viața reală, API-urile sunt accesate programabil printr-o aplicație client separată sau prin JavaScript în browser.
Acesta este motivul pentru care, în plus față de server, este esențial să existe capacități de client HTTP bune în limba dvs. de programare de care aveți nevoie.
O bibliotecă de client HTTP foarte populară este, din nou, cURL. Ați fost deja familiarizați cu comanda cURL de la începutul acestui tutorial. cURL include atât un program de linie de comandă autonomă, cât și o bibliotecă care poate fi folosită de diverse limbi de programare. În special, cURL este, deseori, soluția client HTTP de alegere pentru dezvoltatorii PHP. Alte limbi, cum ar fi Python, oferă mai multe biblioteci de clienți HTTP nativi.
Vreau să expun cât mai mult posibil funcționalitatea la nivel inferior.
Exemplul nostru de aplicație PHP este extrem de goale. Vreau să expun funcționalitatea la nivel inferior cât mai mult posibil, fără nici un cadru magic. De asemenea, nu am vrut să folosesc un API real, cum ar fi Twitter, deoarece acestea pot fi modificate în mod neașteptat, trebuie să configurați autentificarea, ceea ce poate fi un hassle și, evident, nu puteți studia implementarea.
Pentru a rula aplicația de exemplu, va trebui să instalați PHP5 și un server web, cu un mecanism de rulare PHP. Versiunea curentă trebuie să aibă cel puțin versiunea 5.2 pentru a avea acces la json_encode ()
și json_decode ()
funcții.
În ceea ce privește serverele, cea mai comună alegere este încă Apache cu mod_php, dar sunteți liber să utilizați orice alternative cu care vă convine. Există o probă de configurare Apache, care conține reguli de rescriere pentru a vă ajuta să configurați rapid aplicația. Toate cererile către orice adresă URL, începând cu / clienți /, trebuie să fie direcționate spre noi server.php fişier.
În Apache, trebuie să activați mod_rewrite și a pus în dotare mod_rewrite configurare undeva în configurația dvs. Apache sau în configurația dvs. .htacess fişier. Pe aici, server.php va răspunde la toate solicitările venite de la server. Același lucru trebuie realizat și cu Nginx sau cu oricare alt server alternativ pe care îl decideți să îl utilizați.
Există două chei pentru procesarea cererilor prin metoda REST. Prima cheie este de a iniția diferite procesări, în funcție de metoda HTTP - chiar și atunci când adresele URL sunt identice. În PHP, există o variabilă în $ _SERVER matrice globală, care determină ce metodă a fost utilizată pentru a face cererea:
$ _SERVER [ 'REQUEST_METHOD']
Această variabilă conține numele metodei ca șir, de exemplu "OBȚINE
","A PUNE
', si asa mai departe.
Cealaltă cheie este să afli care URL a fost solicitat. Pentru aceasta, folosim o altă variabilă standard PHP:
$ _SERVER [ 'REQUEST_URI']
Această variabilă conține adresa URL pornind de la prima slash. De exemplu, dacă numele gazdei este "example.com
","http://example.com/
"s-ar întoarce"/
', in timp ce 'http://example.com/test/
"s-ar întoarce"/Test/
'.
Să încercăm mai întâi să determinăm ce adresa URL a fost apelată. Considerăm doar adresele URL care încep cu 'clienți
“. Toate celelalte sunt nevalabile.
$ resource = array_shift (căi $); dacă ($ resource == 'clienți') $ name = array_shift ($ paths); dacă (gol ($ name)) $ this-> handle_base (metoda $); altceva $ this-> handle_name (metoda $, nume $); altceva // Noi gestionăm resursele numai în antetul "clienți" ("HTTP / 1.1 404 Not Found");
Avem două rezultate posibile:
Dacă există un alt identificator, presupunem că acesta este numele clientului și, din nou, îl transmite într-o funcție diferită, în funcție de metodă
. Noi folosim a intrerupator
, care ar trebui evitată într-o aplicație reală:
comutare (metoda $) caz 'PUT': $ this-> create_contact ($ name); pauză; cazul "DELETE": $ this-> delete_contact ($ name); pauză; cazul "GET": $ this-> display_contact ($ name); pauză; implicit: antetul ("metoda HTTP / 1.1 405 nu este permisă"); antetul ("Permite: GET, PUT, DELETE"); pauză;
Codurile de răspuns HTTP standardizează o modalitate de a informa clientul cu privire la rezultatul solicitării sale.
S-ar putea să fi observat că aplicația de exemplu utilizează PHP antet()
, trecând niște argumente ciudate ca argumente. antet() funcția imprimă HTTP antete
și asigură că acestea sunt formatate corespunzător. Antetele ar trebui să fie primul lucru pe răspuns, deci nu ar trebui să scoateți nimic altceva înainte de a termina cu anteturile. Uneori, serverul dvs. HTTP poate fi configurat să adauge alte antete, pe lângă cele specificate în codul dvs..
Antetele conțin tot felul de meta informație; de exemplu, codificarea textului utilizat în corpul mesajului sau tipul MIME al conținutului corpului. În acest caz, specificăm în mod explicit codurile de răspuns HTTP. Codurile de răspuns HTTP standardizează o modalitate de a informa clientul cu privire la rezultatul solicitării sale. În mod implicit, PHP returnează a 200
răspuns, ceea ce înseamnă că răspunsul este reușit.
Serverul ar trebui să returneze codul de răspuns HTTP cel mai potrivit; în acest fel, clientul poate încerca să-și repare erorile, presupunând că există vreunul. Cei mai mulți oameni sunt familiarizați cu comunul 404 Nu a fost gasit
codul de răspuns, cu toate acestea, există mult mai multe disponibile pentru a se potrivi unei game largi de situații.
Rețineți că semnificația unui cod de răspuns HTTP nu este extrem de precisă; aceasta este o consecință a faptului că HTTP este mai degrabă generic. Trebuie să încercați să utilizați codul de răspuns care se potrivește cel mai bine cu situația la îndemână. Acestea fiind spuse, nu vă faceți griji prea mult dacă nu puteți găsi o potrivire exactă.
Iată câteva coduri de răspuns HTTP, care sunt adesea folosite cu REST:
Acest cod de răspuns indică faptul că cererea a avut succes.
Aceasta indică faptul că cererea a avut succes și că a fost creată o resursă. Este folosit pentru a confirma succesul unui a A PUNE
sau POST
cerere.
Solicitarea a fost incorectă. Acest lucru se întâmplă în special cu POST
și A PUNE
solicită, atunci când datele nu trece validarea sau sunt în format greșit.
Acest răspuns indică faptul că resursa necesară nu a putut fi găsită. În general, aceasta este returnată tuturor solicitărilor care indică o adresă URL fără resurse corespunzătoare.
Această eroare indică faptul că trebuie să efectuați autentificarea înainte de a accesa resursa.
Metoda HTTP folosită nu este acceptată pentru această resursă.
Acest lucru indică un conflict. De exemplu, folosiți a A PUNE
cereți să creați de două ori aceeași resursă.
Când totul eșuează; în general, un răspuns de 500 este utilizat atunci când procesul de procesare eșuează din cauza unor circumstanțe neprevăzute pe partea de server, ceea ce cauzează erorile serverului.
Să începem pur și simplu prin preluarea informațiilor din aplicație. Vrem detaliile clientului "jim
", așa că să trimitem un simplu OBȚINE
solicitați adresa URL pentru această resursă:
curl -v http: // localhost: 80 / clienți / imi
Aceasta va afișa antetele complete ale mesajelor. Ultimul rând din răspuns va fi corpul mesajului; în acest caz, va fi JSON care conține adresa lui Jim (amintiți-vă că omiterea unui nume de metodă va avea ca rezultat o OBȚINE
cerere; înlocuiți, de asemenea localhost: 80
cu numele serverului și portul pe care îl utilizați).
În continuare, putem obține informațiile pentru toți clienții simultan:
curl -v http: // localhost: 80 / clienți /
Pentru a crea un nou client, numit Paul ...
curl -v -X PUT http: // localhost: 80 / clienți / paul -d '"adresa": "Sunset Boulevard"
și veți primi lista tuturor clienților care conțin acum Paul ca o confirmare.
În cele din urmă, pentru a șterge un client:
curl -v -X DELETE http: // localhost: 80 / clienți / anne
Veți găsi că JSON returnat nu mai conține date despre Anne.
Dacă încercați să preluați un client care nu există, de exemplu:
curl -v http: // localhost: 80 / clienți / jerry
Veți obține o eroare de 404, în timp ce, dacă încercați să creați un client care există deja:
curl -v -X PUT http: // localhost: 80 / clienți / anne
Veți primi în schimb o eroare de 409.
În general, cu cât mai puține ipoteze dincolo de HTTP pe care le faceți, cu atât mai bine.
Este important să ne amintim că HTTP a fost conceput pentru a comunica între sisteme, care nu au decât o înțelegere a protocolului. În general, mai puține ipoteze dincolo de HTTP pe care le faceți, cu atât mai bine: aceasta permite celei mai largi game de programe și dispozitive să acceseze API-ul dvs..
Am folosit PHP în acest tutorial, pentru că este foarte probabil limba cea mai familiarizată cititorilor Nettuts +. Acestea fiind spuse, PHP, desi este conceputa pentru web, probabil nu este cea mai buna limba pe care o poti folosi atunci cand lucrezi intr-un mod REST, A PUNE
solicită într - un mod complet diferit de OBȚINE
și POST
.
Dincolo de PHP, puteți lua în considerare următoarele:
Printre aplicațiile care încearcă să adere la principiile REST, exemplul clasic este Protocolul de publicare Atom, deși nu este utilizat în mod cinstit prea des în practică. Pentru o aplicație modernă, construită pe baza filozofiei de utilizare a HTTP la maxim, consultați Apache CouchDB.
Și nu uitați să verificați selecția de scripturi de cod, pluginuri și aplicații de pe Envato Market.
A se distra!
Am creat un ghid complet care vă ajută să învățați JavaScript, indiferent dacă începeți doar ca dezvoltator web sau doriți să explorați subiecte mai avansate.