Çfarë është një kërkesë HTTP (mesazh HTTP)? Si të dërgoni një kërkesë postimi nga një shfletues: metoda e postimit Çfarë është një kërkesë http.

Për të cilën diskutuam në shënimin e mëparshëm, ekziston një metodë tjetër për dërgimin e një kërkese përmes protokollit HTTP - metoda POST. Metoda POST përdoret gjithashtu shumë shpesh në praktikë.

Nëse, për të hyrë në server duke përdorur metodën GET, ishte e mjaftueshme që ne të shkruanim një kërkesë në URL, atëherë në metodën POST gjithçka funksionon sipas një parimi tjetër.

Për të kryer këtë lloj kërkese, duhet të klikojmë në butonin me atributin type="submit", i cili ndodhet në faqen e internetit. Vini re se ky buton ndodhet në element

, e cila ka atributin e metodës të vendosur në postim.

Merrni parasysh këtë kod HTML:

Fut tekstin:


Nëse përdoruesi fut një tekst në fushën e tekstit dhe klikon në butonin "Dërgo", atëherë ndryshorja e tekstit do të dërgohet në server me vlerën e përmbajtjes që përdoruesi ka futur. Kjo variabël do të dërgohet me metodën POST.

Nëse shkruani në këtë formë:

Të dhënat do të dërgohen duke përdorur metodën GET.

Nëse, në rastin e një kërkese GET, sasia e të dhënave që mund të transferonim ishte e kufizuar nga gjatësia e shiritit të adresave të shfletuesit, atëherë në rastin e një kërkese POST, nuk ka një kufi të tillë dhe ne mund të transferojmë shuma të konsiderueshme të informacionit.

Një tjetër ndryshim midis metodës POST dhe metodës GET është se metoda POST fsheh të gjitha variablat dhe vlerat e tyre që u kalohen atyre në trupin e saj (Entity-Body). Në rastin e metodës GET, ato u ruajtën në vargun e kërkesës (Kërkesë-URI).

Këtu është një shembull i një kërkese të bërë duke përdorur metodën POST:

POST / HTTP/1.0\r\n
Pritësi: www.site.ru\r\n
Referues: http://www.site.ru/index.html\r\n
Cookie: të ardhura=1\r\n
Lloji i përmbajtjes: aplikacion/x-www-form-urlencoded\r\n
Përmbajtja-Gjatësia: 35\r\n
\r\n
login=Dima&fjalëkalimi=12345

Kështu, kur transmetoni të dhëna duke përdorur metodën POST, do të jetë shumë më e vështirë për një sulmues që t'i përgjojë ato, sepse ato janë të fshehura nga pamja e drejtpërdrejtë, kështu që metoda POST e transferimit të të dhënave konsiderohet një metodë më e sigurt.

Përveç kësaj, duke përdorur metodën POST, mund të transferoni jo vetëm tekst, por edhe të dhëna multimediale (foto, audio, video). Ekziston një parametër i veçantë Content-Type që specifikon llojin e informacionit që do të dërgohet.

Dhe së fundi, për të marrë të dhënat që janë transmetuar me këtë metodë në server, përdoret ndryshorja POST.

Këtu është një shembull i përpunimit në PHP:

jehonë $_POST['tekst'];
?>

Nga rruga, unë vendosa raporte, qëllime dhe ngjarje në sistemet Yandex Metrica dhe Google Analytics.

Pavarësisht nëse jeni apo jo programues, e keni parë atë në të gjithë internetin. Për momentin në shiriti i adresave shfletuesi shfaq diçka që fillon me "http://". Edhe skripti juaj i parë Hello World dërgoi një titull HTTP pa e kuptuar ju. Në këtë artikull, ne do të mësojmë mbi bazat e titujve HTTP dhe se si ato mund të përdoren në aplikacionet tona të internetit.

Cilat janë titujt HTTP?

HTTP do të thotë "Protokolli i Transferimit të Hipertekstit". World Wide Web përdor këtë protokoll. Ajo u krijua në fillim të viteve 1990. Pothuajse gjithçka që shihni në shfletuesin tuaj transmetohet në kompjuterin tuaj nëpërmjet HTTP. Për shembull, kur hapët këtë faqe artikulli, shfletuesi juaj dërgoi mbi 40 kërkesa HTTP dhe mori përgjigje HTTP për secilën prej tyre.

Titujt HTTP janë pjesa kryesore e këtyre kërkesave dhe përgjigjeve HTTP, dhe ato përmbajnë informacion në lidhje me shfletuesin e klientit, faqen e kërkuar, serverin dhe më shumë.

Shembull

Kur futni një URL në shiritin e adresave, shfletuesi juaj dërgon një kërkesë HTTP dhe mund të duket kështu:

GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 Pritësi: net.tutsplus.com Agjenti i përdoruesit: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9. 1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Prano: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Prano-Gjuha: en -us,en;q=0,5 Prano-Enkodimi: gzip,deflate Prano-Charset: ISO-8859-1,utf-8;q=0,7,*;q=0,7 Keep-Alive: 300 Lidhja: Keep-live Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120 Pragma: pa cache Cache-Control: pa cache

Rreshti i parë është "Linja e Kërkesës" e cila përmban disa informacione bazë rreth kërkesës. Pjesa tjetër janë titujt HTTP.

Pas kësaj kërkese, shfletuesi juaj merr një përgjigje HTTP që mund të duket si kjo:

HTTP/1.x 200 OK Transferimi-Enkodimi: i copëtuar Data: Sht, 28 nëntor 2009 04:36:25 GMT Serveri: LiteSpeed ​​Lidhja: mbyll X-Powered-By: W3 Total Cache/0.8 Pragma: publike Skadon: Shtunë , 28 nëntor 2009 05:36:25 GMT Etiketa: "pub1259380237;gz" Cache-Control: max-age=3600, publike Lloji i përmbajtjes: tekst/html; charset=UTF-8 Modifikimi i fundit: Sht, 28 nëntor 2009 03:50:37 GMT X-Pingback: http://net.tutsplus.com/xmlrpc.php Përmbajtja-Enkodimi: gzip Vari: Prano-Encoding, Cookie, Agjenti i përdoruesit 20+ praktikat më të mira të MySQL - Nettuts+

Rreshti i parë është "Linja e Statusit" e ndjekur nga "Titujt HTTP" deri në rreshtin bosh. Pas kësaj, fillon "përmbajtja" (në këtë rast, prodhimi HTML).

Kur shikoni në burimi faqen e internetit në shfletuesin tuaj, ju shihni vetëm pjesën HTML dhe jo titujt HTTP, edhe pse ato në të vërtetë janë dërguar së bashku.

Këto kërkesa HTTP dërgohen dhe pranohen gjithashtu për gjëra të tjera si imazhe, skedarë CSS, skedarë JavaScript, etj. Kjo është arsyeja pse thashë më herët se shfletuesi juaj dërgoi të paktën 40 ose më shumë kërkesa HTTP pasi që keni shkarkuar vetëm këtë faqe artikulli.

Tani le të shohim strukturën në më shumë detaje.

Si të shihni titujt HTTP

Për të analizuar titujt HTTP, unë përdor shtesat e mëposhtme të Firefox-it:

Titujt HTTP në kërkesat HTTP

Tani do të shikojmë disa nga titujt më të zakonshëm të HTTP që gjenden në kërkesat HTTP.

Pothuajse të gjithë këta tituj mund të gjenden në grupin $_SERVER në PHP. Ju gjithashtu mund të përdorni funksionin getallheaders() për të tërhequr të gjitha titujt në të njëjtën kohë.

Mikpritës

Një kërkesë HTTP dërgohet në adresa IP specifike. Por meqenëse shumica e serverëve janë të aftë të presin shumë site nën të njëjtën IP, ata duhet të dinë se çfarë emri domeni kërkon shfletuesi.

Pritësi: net.tutsplus.com

Në thelb është një emër hosti, duke përfshirë domenin dhe nëndomain.

Në PHP mund të gjendet si $_SERVER["HTTP_HOST"] ose $_SERVER["SERVER_NAME"].

Agjenti i përdoruesit

Agjenti i përdoruesit: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)

Ky titull mund të përmbajë disa pjesë të informacionit si:

  • Emri dhe versioni i shfletuesit.
  • Emri dhe versioni sistemi operativ.
  • Gjuha e parazgjedhur.

Kjo është mënyra se si faqet e internetit mund të mbledhin disa informacion i pergjithshem në lidhje me sistemet e tyre të surferëve. Për shembull, ata mund të zbulojnë nëse një surfer po përdor një shfletues celular dhe t'i ridrejtojë ata te versioni celular e faqes tuaj të internetit, e cila funksionon më mirë me rezolucion të ulët.

Në PHP mund të shprehet kështu: $_SERVER["HTTP_USER_AGENT"].

Nëse (strstr($_SERVER["HTTP_USER_AGENT"],"MSIE 6")) (jehonë "Ju lutemi ndaloni së përdoruri IE6!"; )

Prano-Gjuha

Prano-Gjuha: en-us,en;q=0.5

Ky titull shfaq cilësimet e paracaktuara të gjuhës. Nëse faqja ka versione të ndryshme gjuhësore, mund të ridrejtojë një surfer të ri bazuar në këto të dhëna.

Në PHP mund të gjendet si ky: $_SERVER["HTTP_ACCEPT_LANGUAGE"].

Nëse (substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2) == "fr") ( header ("Vendndodhja: http://french.mydomain.com"); )

Prano kodimin

Prano-Enkodimi: gzip, deflate

Shumica e shfletuesve modernë mbështesin gzip dhe e dërgojnë atë në kokë. Ueb serveri më pas mund të dërgojë HTML-në dalëse në një format të ngjeshur. Kjo lejon që madhësia të zvogëlohet deri në 80% për të kursyer gjerësinë e brezit dhe kohë.

Në PHP mund të gjendet kështu: $_SERVER["HTTP_ACCEPT_ENCODING"]. Megjithatë, kur përdorni funksionin e kthimit të thirrjes ob_gzhandler(), ai do të kontrollojë vlerën automatikisht, kështu që nuk keni nevojë.

// mundëson buferimin e daljes // dhe i gjithë dalja kompresohet nëse shfletuesi e mbështet atë ob_start("ob_gzhandler");

Nëse-Modifikuar-Që

Nëse një dokument ueb është ruajtur tashmë në memorien e shfletuesit tuaj dhe ju e vizitoni përsëri, shfletuesi juaj mund të kontrollojë nëse dokumenti është përditësuar duke dërguar sa vijon:

Nëse nuk ka ndryshuar që nga ajo datë, serveri dërgon një kod përgjigjeje "304 Not Modified", por përmbajtja jo, dhe shfletuesi ngarkon përmbajtjen nga cache.

Në PHP mund të gjendet kështu: $_SERVER["HTTP_IF_MODIFIED_SINCE"].

// supozojmë se $last_modify_time ishte hera e fundit që dalja u përditësua // a dërgoi shfletuesi kokën If-Modified-Since? if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) ( // nëse cache e shfletuesit përputhet me kohën e modifikimit nëse ($last_modify_time == strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"])) ( // dërgoni një kokë 304, dhe pa titull përmbajtjeje ("HTTP/1.1 304 i pandryshuar"); dil; ) )

Ekziston gjithashtu një kokë Etag HTTP që mund të përdoret për të kontrolluar cache-në aktuale. Ne do të flasim për këtë së shpejti.

biskotë

Siç sugjeron emri, kjo dërgon biskota ruajtur në shfletuesin tuaj për këtë domen.

Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar

Këto janë çifte emër=vlerë të ndara me pikëpresje. Cookies mund të përmbajnë gjithashtu një ID sesioni.

Në PHP, cookie-t individuale mund të aksesohen duke përdorur grupin $_COOKIE. Mund të përdorni variablat e sesionit drejtpërdrejt duke përdorur grupin $_SESSION dhe nëse keni nevojë për id-në e sesionit, mund të përdorni funksionin session_id() në vend të cookie-t.

echo $_COOKIE["foo"]; // dalje: jehonë e shiritit $_COOKIE["PHPSESSID"]; // dalje: r2t5uvjq435r4q7ib3vtdjq120 session_start(); echo sesion_id(); // dalje: r2t5uvjq435r4q7ib3vtdjq120

Referues

Siç sugjeron emri, ky titull HTTP përmban url-në e lidhjes.

Për shembull, nëse shkoj në faqen kryesore të Nettuts+ dhe klikoj në një lidhje artikulli, ky titull do të dërgohet në shfletuesin tim:

Referues: http://net.tutsplus.com/

Në PHP mund të gjendet si $_SERVER["HTTP_REFERER"].

Nëse (isset($_SERVER["HTTP_REFERER"])) ($url_info = parse_url($_SERVER["HTTP_REFERER"]); // është surferi që vjen nga Google? nëse ($url_info["host"] == "www .google.com") ( parse_str($url_info["query"], $vars); echo "Ke kërkuar në Google këtë fjalë kyçe: ". $vars["q"]; ) ) // nëse url-ja referuese ishte : // http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9 // dalja do të jetë: // Keni kërkuar në Google për kjo fjalë kyçe: titujt http

Ju mund të keni vënë re se fjala "referues" është shkruar gabim si "referues". Fatkeqësisht, ai u kthye në specifikimin zyrtar të HTTP në një mënyrë të ngjashme dhe ngeci.

Autorizimi

Autorizimi: Bazë bXl1c2VyOm15cGFzcw==

Të dhënat brenda kokës janë të koduara base64. Për shembull, base64_decode("bXl1c2VyOm15cGFzcw ==") do të kthente "myuser: mypass"

Në PHP, këto vlera mund të gjenden si $_SERVER["PHP_AUTH_USER"] dhe $_SERVER["PHP_AUTH_PW"].

Më shumë për këtë do të vijë kur të flasim për titullin WWW-Authenticate.

Titujt HTTP në përgjigjet HTTP

Tani do të shikojmë disa nga titujt më të zakonshëm të HTTP që gjenden në përgjigjet HTTP.

Në PHP, ju mund të vendosni titujt e përgjigjeve duke përdorur funksionin header(). PHP tashmë dërgon tituj të caktuar automatikisht, për të ngarkuar përmbajtjen dhe për të vendosur kuki dhe gjëra të tjera... Ju mund të shihni titujt që dërgohen ose do të dërgohen me funksionin headers_list(). Ju mund të kontrolloni nëse titujt janë dërguar tashmë duke përdorur funksionin headers_sent().

Cache-Control

Përkufizimi nga w3.org: "Fusha e titullit Cache-Control përdoret për të specifikuar direktivat që DUHET të ndiqen nga të gjithë motorët e memorizimit përgjatë zinxhirit të kërkesës/përgjigjes." Këta "mekanizma të ruajtjes së memories" përfshijnë porta dhe proxies që mund të përdorë ISP-ja juaj.

Cache-Control: max-age=3600, public

"publike" do të thotë që përgjigja mund të ruhet nga kushdo. "Max-age" tregon se sa sekonda është e vlefshme cache. Lejimi i faqes tuaj në cache mund të zvogëlojë ngarkesën e serverit dhe xhiros, si dhe të rrisë kohën e ngarkimit në shfletues.

Caching-u gjithashtu mund të parandalohet me direktivën "no-cache".

Cache-Control: pa cache

lloji i përmbajtjes

Ky titull specifikon "lloj-mime" të dokumentit. Shfletuesi më pas përcakton se si të interpretojë përmbajtjen bazuar në atë. Për shembull, një faqe html (ose një skript PHP me dalje html) mund të kthejë këtë:

Lloji i përmbajtjes: tekst/html; charset=UTF-8

"tekst" është lloji dhe "html" është nëntipi i dokumentit. Kreu gjithashtu mund të përmbajë më shumë informacion, si p.sh.

Për një imazh gif, kjo mund të dërgohet.

Lloji i përmbajtjes: imazh/gif

Shfletuesi mund të përdorë një aplikacion të jashtëm ose shtesë të shfletuesit bazuar në llojin e mimës. Për shembull, kjo do të ngarkojë Adobe Reader:

Lloji i përmbajtjes: aplikacion/pdf

Kur ngarkohet drejtpërdrejt, Apache zakonisht mund të zbulojë llojin mime të dokumentit dhe të dërgojë kokën e duhur. Përveç kësaj, shumica e shfletuesve kanë një farë shkalle dështimi dhe zbulimi automatik të llojeve të mimave nëse titujt janë të pasaktë ose mungojnë.

Mund të gjeni një listë të llojeve të zakonshme të mimave.

Në PHP, mund të përdorni funksionin finfo_file() për të përcaktuar llojin mime të një skedari.

përmbajtje-dispozitë

Ky titull i thotë shfletuesit të hapë një dritare shkarkimi skedari në vend që të përpiqet të analizojë përmbajtjen. Shembull:

Përmbajtja-Dispozita: shtojcë; filename = "download.zip"

Kjo do ta detyrojë shfletuesin të bëjë këtë:

Vini re se së bashku me këtë duhet të dërgohet edhe titulli përkatës i llojit të përmbajtjes:

Lloji i Përmbajtjes: aplikacion/zip Përmbajtja-Dispozicion: bashkëngjitje; filename = "download.zip"

gjatësia e përmbajtjes

Kur përmbajtja i shërbehet shfletuesit, serveri mund të tregojë madhësinë e tij (në bajt) duke përdorur këtë titull.

Gjatësia e përmbajtjes: 89123

Kjo është veçanërisht e dobishme kur ngarkoni skedarë. Kjo është mënyra se si shfletuesi mund të përcaktojë ecurinë e shkarkimit.

Për shembull, këtu është një skenar tallës që kam shkruar që simulon një nisje të ngadaltë.

// it"sa header file zip("Content-Type: application/zip"); // 1 milion byte (rreth 1 megabyte) header ("Content-Length: 1000000"); // ngarkoni një dialog shkarkimi dhe ruajeni si titulli download.zip ("Content-Disposition: attachment; filename="download.zip""); // 1000 herë 1000 bajt të dhëna për ($i = 0; $i< 1000; $i++) { echo str_repeat(".",1000); // sleep to slow down the download usleep(50000); }

Këtu është rezultati:

Tani do të komentoj kokën e gjatësisë së përmbajtjes

// është një kokë e skedarit zip ("Lloji i përmbajtjes: aplikacion/zip"); // shfletuesi nuk do ta dijë madhësinë // kokën ("Gjatësia e përmbajtjes: 1000000"); // ngarkoni një dialog shkarkimi dhe ruajeni si titull download.zip ("Content-Disposition: attachment; filename="download.zip""); // 1000 herë 1000 bajt të dhëna për ($i = 0; $i< 1000; $i++) { echo str_repeat(".",1000); // sleep to slow down the download usleep(50000); }

Tani rezultati është:

Shfletuesi mund t'ju tregojë vetëm sa bajt janë shkarkuar, por nuk e di totalin. Dhe shiriti i progresit nuk tregon përparim.

Etag

Ky është një tjetër titull që përdoret për caching. Duket kështu:

Etiketa: "pub1259380237;gz"

Serveri i uebit mund ta dërgojë këtë titull me çdo dokument që shërben. Vlera mund të bazohet në datën e fundit të modifikuar, madhësinë e skedarit, apo edhe kontrollin e skedarit. Shfletuesi më pas e ruan këtë vlerë ndërsa ruan dokumentin. Herën tjetër që shfletuesi kërkon të njëjtin skedar, ai e dërgon këtë në një kërkesë HTTP:

Nëse-asnjë-përputhet: "pub1259380237;gz"

Nëse vlera Etag e dokumentit përputhet me këtë, serveri do të dërgojë një 304 në vend të një 200 dhe pa përmbajtje. Shfletuesi do të ngarkojë përmbajtjen nga cache e tij.

E modifikuara e fundit

Siç sugjeron emri, ky titull specifikon datën kur dokumenti është modifikuar për herë të fundit në formatin GMT:

Ndryshuar së fundi: Sht, 28 nëntor 2009 03:50:37 GMT $modify_time = filemtime($file); header("Modifikimi i fundit: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT");

Kjo i ofron shfletuesit një mënyrë tjetër për të ruajtur memorien e dokumentit. Shfletuesi mund ta dërgojë këtë në një kërkesë HTTP:

Ne kemi folur tashmë për këtë më herët në seksionin "Nëse-Modifikuar-Që".

vendndodhjen

Ky titull përdoret për ridrejtimin. Nëse kodi i përgjigjes është 301 ose 302, serveri duhet të dërgojë gjithashtu këtë kokë. Për shembull, kur shkoni te http://www.nettuts.com, shfletuesi juaj do të marrë sa vijon:

HTTP/1.x 301 Lëvizur përgjithmonë ... Vendndodhja: http://net.tutsplus.com/ ...

Në PHP ju mund të ridrejtoni surfer si kjo:

Header ("Vendndodhja: http://net.tutsplus.com/");

Si parazgjedhje, kjo do të dërgojë një kod përgjigjeje 302. Nëse dëshironi të dërgoni në vend të 301:

Header("Vendndodhja: http://net.tutsplus.com/", true, 301);

set-cookie

Kur një faqe interneti dëshiron të vendosë ose përditësojë një cookie në shfletuesin tuaj, ai do të përdorë këtë titull.

set-cookie: skin=hipur; shteg=/; domain=.amazon.com; skadon=Die, 29-Nëntor-2009 21:42:28 GMT Set-Cookie: sesion-id=120-7333518-8165026; shteg=/; domain=.amazon.com; skadon=E shtunë 27 shkurt 08:00:00 2010 GMT

Çdo cookie dërgohet si një titull i veçantë. Ju lutemi vini re se kukit e vendosur me JavaScript nuk kalojnë nëpër titujt HTTP.

Në PHP, ju mund të vendosni kuki duke përdorur funksionin setcookie() dhe PHP dërgon titujt e duhur HTTP.

Setcookie ("TestCookie", "foobar");

Që rezulton në dërgimin e këtij titulli:

Set-Cookie: TestCookie=foobar

Nëse nuk specifikohet asnjë datë skadimi, cookie-ja fshihet kur dritarja e shfletuesit mbyllet.

WWW-Vërteto

Faqja mund ta dërgojë këtë titull për të vërtetuar përdoruesin nëpërmjet HTTP. Kur shfletuesi e sheh këtë kokë, ai do të hapë dialogun e hyrjes.

WWW-Authenticate: Basic Realm="Zonë e kufizuar"

Si do të duket kështu:

Ne kemi vendosur që shfletuesi (klienti) të dërgojë kërkesa HTTP te serveri dhe serveri të dërgojë përgjigje HTTP te klienti. Këto kërkesa dhe përgjigje bëhen sipas rregullave të caktuara. Ka diçka si sintaksa, si dhe në çfarë sekuence duhet të shkruhet. Duhet të ketë një strukturë të përcaktuar rreptësisht.

Le të hedhim një vështrim më të afërt në këtë strukturë, e cila ndërton kërkesat dhe përgjigjet në protokollin HTTP.

Një kërkesë HTTP përbëhet nga tre pjesë kryesore, të cilat shfaqen në rendin e renditur më poshtë. Midis titujve dhe trupit të mesazhit ka një rresht bosh (si ndarës), ai përfaqëson karakterin e linjës së re.

1. Linja e Kërkesës

2. Titujt (Titujt e mesazheve)

Varg bosh (ndarës)

3. trupi i mesazhit (Entity Body) - parametër opsional

Vargu i pyetjes- Përcakton metodën e transferimit, URL-në për të hyrë dhe versionin e protokollit HTTP.

Titujt– përshkruani trupin e mesazhit, kaloni parametra të ndryshëm dhe informacione dhe informacione të tjera.

trupi i mesazhit- këto janë vetë të dhënat që transmetohen në kërkesë. Trupi i mesazhit është opsional dhe mund të hiqet.

Kur marrim një kërkesë për përgjigje nga serveri, trupi i mesazhit është më së shpeshti përmbajtja e faqes së internetit. Por, kur bëni kërkesa në server, ai ndonjëherë mund të jetë i pranishëm, për shembull, kur transferojmë të dhënat që kemi plotësuar në formular. reagime te serveri.

Në mënyrë më të detajuar, çdo element të kërkesës, do të shqyrtojmë në shënimet e mëposhtme.

Le të shqyrtojmë, për shembull, një kërkesë reale për serverin. Unë theksova secilën pjesë të kërkesës me një ngjyrë të ndryshme: vargu i pyetjes është i gjelbër, titujt janë portokalli dhe trupi i mesazhit është blu.

Kërkesa e shfletuesit:

GET/HTTP/1.1

host: faqe interneti

Agjenti i përdoruesit: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0

Prano: tekst/html,aplikacion/xhtml+xml,aplikacion/xml;q=0.9,*/*;q=0.8

Prano-Gjuha: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3

Prano-Enkodimi: gzip, deflate

Cookie: wp-settings

Lidhja: mbaj gjallë

Në shembullin e mëposhtëm, trupi i mesazhit është tashmë i pranishëm.

Përgjigja e serverit:

HTTP/1.1 200 OK

Lloji i përmbajtjes: tekst/html; charset=UTF-8

Transferimi-Enkodimi: i copëtuar

Lidhja: mbaj gjallë

Keep Alive: timeout=5

Serveri: Apache

X-Pingback: //site/xmlrpc.php

Dokument pa titull



Këto janë mesazhet e shkëmbyera ndërmjet klientit dhe serverit nëpërmjet protokollit HTTP.

Nga rruga, unë vendosa raporte, qëllime dhe ngjarje në sistemet Yandex Metrica dhe Google Analytics.

Struktura e kërkesës (8)

Në një kërkesë HTTP MARR parametrat dërgohen si varg pyetjesh :

http://example.com/page ?parameter=vlerë&gjithashtu=një tjetër

Në një kërkesë HTTP POST parametrat nuk dërgohen së bashku me URI.

Ku janë vlerat? Në kokën e kërkesës? Në organin e kërkesës? Si duket?

Përgjigjet

Vlerat e formularit në mesazhet HTTP-POST dërgohen në trupin e kërkesës në të njëjtin format si kërkesa.

Shih specifikat për më shumë informacion.

Disa shërbime ueb kërkojnë që ju të prisni të dhëna kërkesë dhe meta të dhënat veçmas. Për shembull, një funksion në distancë mund të presë që një varg i nënshkruar i meta të dhënave të përfshihet në URI dhe të dhënat të dërgohen në një paketë HTTP.

Një kërkesë POST mund të duket semantikisht kështu:

POST /?AuthId=YOURCEY&Action=WebServiceAction&Signature=rcLXfkPldrYm04 HTTP/1.1 Lloji i përmbajtjes: tekst/tab-separated-values; charset=iso-8859-1 Gjatësia e përmbajtjes: Pritësi: webservices.domain.com Prano: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Prano-Enkodimi: identiteti Agjenti i përdoruesit: Mozilla/3.0 (i pajtueshëm; Biblioteka Indy) emri id John G12N Sarah J87M Bob N33Y

Kjo qasje kombinon logjikisht QueryString dhe Body-Post duke përdorur një lloj të vetëm përmbajtjeje, i cili është një "udhëzim analizimi" për serverin në internet.

Shënim: HTTP/1.1 i mbështjellë në #32 (hapësirë) në të majtë dhe me #10 (Furnizimi i linjës) në të djathtë.

Para së gjithash, le të marrim dhe postojmë

Merrni: Kjo është kërkesa e parazgjedhur HTTP që bëhet në server dhe përdoret për të marrë të dhëna nga serveri dhe vargun e pyetjes që vjen më pas? në URI përdoret për të tërhequr një burim unik.

ky është formati

GET /someweb.asp?data=value HTTP/1.0

ku data=value është vlera e kaluar e vargut të pyetjes.

POST: përdoret për dërgimin e sigurt të të dhënave në server në mënyrë që gjithçka që nevojitet është formati i kërkesës POST

POST /somweb.aspHTTP/1.0 Host: localhost Lloji i përmbajtjes: aplikacion/x-www-form-urlencoded //mund të vendosni çdo format këtu Gjatësia e përmbajtjes: 11 //varet Emri= somename

Pse POST mbi GET?

Në GET, vlera e dërguar te serverët zakonisht i shtohet URL-së bazë në vargun e pyetjes. Kjo lejon që të dhënat tuaja të hakohen (ky ishte një problem në ditët për Facebook ku ishin vendosur kredencialet tuaja) kështu që POST përdorej për të dërguar të dhëna te serveri i cili përdorte Trupin e Kërkesës për të dërguar të dhënat tuaja te serveri i cili është më i sigurt pasi ai fsheh të dhënat tuaja dhe merr të dhënat tuaja nga fushat, llogarit gjatësinë e saj dhe i shton ato në kokë për gjatësinë e përmbajtjes dhe asnjë e dhënë e rëndësishme nuk i bashkëngjitet drejtpërdrejt url-së

tani që kërkesa juaj është e sigurt, çdo vlerë e dërguar në server mund të dërgohet në Trupin e Kërkesës pasi emri nënkupton se do të përmbajë të dhënat e përdoruesve që dëshironi të dërgoni (dhe dërgohet në formatin e koduar të URL-së së koduar me URL) dhe Titujt e kërkesës do ta mbajnë kërkesën të sigurt duke krahasuar vlerat në Trupin e Kërkesës me Titujt e Kërkesës

Mund të përdorni seksionin e uebit të Veglave të Zhvilluesve të Google për të gjetur informacionin bazë se si bëhen kërkesat në serverë.

dhe gjithmonë mund të shtoni më shumë vlera në titujt e kërkesave si Cache-Control, Origin, Accept.

Përgjigja e shkurtër: në kërkesat POST, vlerat dërgohen në "trupin" e kërkesës. Në formularët e internetit, ato ka shumë të ngjarë të dorëzohen me aplikacionin e llojit të medias/x-www-form-urlencoded ose me shumë pjesë/formë-të dhëna. Gjuhët e programimit ose kornizat e krijuara për të trajtuar kërkesat në ueb zakonisht bëjnë "The Right Thing™" me kërkesa të tilla dhe ju japin akses të lehtë në vlerat e dekodueshme lehtësisht (p.sh. $_REQUEST ose $_POST e PHP ose cgi.FieldStorage(), flask . kërkesë.formë në Python).

Tani le të devijojmë pak, gjë që mund të ndihmojë për të kuptuar ndryshimin ;)

Dallimi midis kërkesave GET dhe POST është kryesisht semantik. Ato gjithashtu "përdoren" ndryshe, gjë që shpjegon ndryshimin në mënyrën se si kalohen vlerat.

GET (seksioni përkatës RFC)

Kur bëni një kërkesë GET, po i kërkoni serverit një ose një grup objektesh. Në mënyrë që klienti të filtrojë rezultatin, ai mund të përdorë të ashtuquajturin "varg pyetjesh" të URL-së. Vargu i pyetjes është pjesa pas? , Kjo është pjesë e sintaksës URI.

Pra, për sa i përket kodit të aplikimit tuaj (pjesa që merr kërkesë) do t'ju duhet të kontrolloni pjesën e kërkesës së URI për të hyrë në ato vlera.

Vini re se çelësat dhe vlerat janë pjesë e URI-së. Shfletuesit mund vendos një kufi në gjatësinë e URI. Standardi HTTP thotë se nuk ka kufizime. Por në kohën e këtij shkrimi, shumica e shfletuesve kufizojnë URI-në (nuk kam vlera specifike). GET kërkesat kurrë duhet të përdoret për të dërguar informacion të ri në server. Sidomos jo dokumente të mëdha. Këtu duhet të përdorni POST ose PUT.

POST (seksioni përkatës RFC)

Kur bën një kërkesë POST, klienti në fakt dërgon një të re dokument host në distancë. Kështu vija kërkesë nuk ka kuptim (semantikisht). Kjo është arsyeja pse ju nuk keni qasje në to në kodin tuaj të aplikimit.

POST është pak më i komplikuar (dhe më fleksibël):

Kur merrni një kërkesë POST, duhet të prisni gjithmonë një "payload", ose në terma HTTP: një trup mesazhi. Vetë trupi i mesazhit është mjaft i padobishëm, pasi nuk ka standarde(me sa di unë. Ndoshta aplikimi/oktet-stream?) format. Formati i trupit përcaktohet nga titulli Content-Type. Kur përdorni një element HTML FORM me metodën="POST" ky zakonisht është aplikacion/x-www-form-urlencoded. Një lloj tjetër shumë i zakonshëm janë të dhënat me shumë pjesë/forma nëse jeni duke përdorur ngarkime skedarësh. Por ndoshta çdo gjë: nga teksti/i thjeshtë, mbi aplikacion/json, apo edhe me aplikacion të personalizuar/transme oktet.

Në çdo rast, nëse një kërkesë POST bëhet me një lloj përmbajtjeje që nuk mund të përpunohet nga aplikacioni, ai duhet të kthejë një kod statusi 415.

Shumica e gjuhëve të programimit (dhe/ose kornizave të uebit) ofrojnë një mënyrë për të de-koduar trupin e mesazhit nga/në llojet më të zakonshme (p.sh. aplikacion/x-www-form-urlencoded, shumëpjesësh/formë-të dhëna, ose aplikacion/ json). Pra, është e lehtë. Llojet e personalizuara potencialisht kërkojnë pak më shumë punë.

Duke përdorur shembullin e një dokumenti standard të koduar me HTML, aplikacioni duhet të ndjekë këto hapa:

  1. Lexoni fushën Content-Type
  2. Nëse vlera nuk është një nga llojet e mediave të mbështetura, atëherë ktheni një përgjigje me kodin e statusit 415
  3. përndryshe, deshifroni vlerat nga trupi i mesazhit.

Përsëri, gjuhët si PHP ose kornizat e uebit për gjuhë të tjera të njohura ndoshta do ta trajtojnë këtë për ju. Përjashtim është gabimi 415. Asnjë kornizë nuk mund të parashikojë se cilat lloje përmbajtjesh zgjedh të mbështesë dhe/ose të mos mbështesë aplikacioni juaj. Kjo varet nga ju.

PUT (seksioni përkatës RFC)

Një kërkesë PUT trajtohet saktësisht si një kërkesë POST. Dallimi i madh është se kërkesa POST duhet të lejojë serverin të vendosë se si (nëse ka) të krijojë burimin e ri. Historikisht (nga RFC2616 tashmë i vjetëruar, supozohej të krijonte një burim të ri si një "vartës" (fëmijë) i URI-së ku u dërgua kërkesa).

Kërkesa PUT supozohet të "shtyjë" saktësisht burimin v këtë URI dhe që nga viti këtë përmbajtje. Jo me shume Jo me pak. Ideja është që klientështë përgjegjës për krijimin i plotë burim për "PUTting". Serveri duhet ta pranojë atë ashtu sic eshte në URL-në e dhënë.

Si pasojë, një kërkesë POST në përgjithësi nuk përdoret për të zëvendësimet burim ekzistues. Mund të krijohet një kërkesë PUT dhe zëvendësojnë.

shënim

Ekzistojnë gjithashtu "parametra të rrugës" që mund të përdoren për të dërguar të dhëna shtesë në telekomandë, por ato janë aq të rralla sa nuk do të hyj në detaje. Por, për referencë, këtu është një fragment nga RFC:

Përveç segmenteve me pika në shtigjet hierarkike, një segment shtegu konsiderohet i errët nga sintaksa e përgjithësuar. URI-të që krijojnë aplikacione shpesh përdorin karakteret e rezervuara të lejuara në një segment për të kufizuar nënkomponentët specifikë për një skemë ose hapësirë ​​të veçantë. Për shembull, pikat e rezervuara (";") dhe barazimet ("=") përdoren shpesh për të kufizuar parametrat dhe vlerat e parametrave që zbatohen për atë segment. Karakteri i presjes së rezervuar ("") përdoret shpesh për qëllime të ngjashme. Për shembull, një prodhues URI mund të përdorë një segment të tillë si "emri; v=1.1" për të treguar një referencë ndaj versionit 1.1 "emri", ndërsa një tjetër mund të përdorë një segment si "emri, 1.1" për ta treguar atë. Llojet e parametrave mund të përcaktohen me semantikë specifike të skemës, por në shumicën e rasteve, sintaksa e parametrave është specifike për zbatimin e algoritmit të dereferencimit URI.

Nuk mund ta futni direkt në shiritin e URL-së së shfletuesit.

Ju mund të shihni se si të dhënat POST dërgohen në ueb duke përdorur titujt HTTP, p.sh. Rezultati do të jetë diçka e tillë

Http: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Prano-Language: en-US,en;q=0.5 Prano-Encoding: gzip, deflate DNT: 1 Referues: http://127.0.0.1/pass.php Cookie: passx=87e8af376bc9d9bfec2c7c0193e6af70; PHPSESSID=l9hk7mfh0ppqecg8gialak6gt5 Lidhja: mbaj gjallë Përmbajtja-Lloji: aplikacion/x-www-form-urlencoded Përmbajtja-Gjatësia: 30 emri i përdoruesit=zurfyx&pass=fjalëkalimi

Ku flet

Gjatësia e përmbajtjes: 30 emri i përdoruesit=zurfyx&pass=fjalëkalimi

do të ketë vlera postare.

Vlerat dërgohen në trupin e kërkesës në formatin e specifikuar në llojin e përmbajtjes.

Zakonisht lloji i përmbajtjes është aplikacion/x-www-form-urlencoded, kështu që trupi i kërkesës përdor të njëjtin format si vargu i kërkesës:

Parametër=vlerë&gjithashtu=një tjetër

Kur përdorni ngarkimin e skedarit të formularit, në vend të kësaj përdorni kodimin e të dhënave me shumë pjesë/forma, i cili ka një format tjetër. Është më e ndërlikuar, por zakonisht nuk keni nevojë të kujdeseni se si duket, kështu që nuk do të tregoj një shembull, por mund të jetë e dobishme të dini se ekziston.

Lloji i parazgjedhur i medias në një kërkesë POST është aplikacioni/x-www-form-urlencoded. Ky është formati për kodimin e çifteve çelës-vlerë. Çelësat mund të dyfishohen. Çdo çift çelës-vlerë ndahet me & , dhe çdo çelës ndahet nga vlera e tij me = .

Për shembull:

Emri: John Smith Klasa: 19

Regjistruar si:

Emri=John+Smith&Grade=19

Ai vendoset në trupin e kërkesës pas titujve HTTP.

Pyetja rilexohet. Aktual pyetja e bërë jo si prefikset e shitësve në pronat CSS, ku ka kuptim të kontrolloni të ardhmen dhe të mendoni për mbështetjen e shitësit dhe standardet zyrtare. Pyetja aktuale e bërë është më e ngjashme me zgjedhjen e emrave të parametrave të pyetjes së URL-së. Askujt nuk duhet t'i interesojë kush janë. Por koincidenca e emrave me ato të zakonshmet është absolutisht e saktë, dhe e përgjithshme dhe e saktë.

Arsyetimi:
Kjo është për marrëveshjet ndërmjet zhvilluesve për tituj specifikë të aplikacioneve me porosi - « të dhëna që lidhen me to llogari ' - të cilat nuk kanë të bëjnë me shitësit, organet e standardeve ose protokollet që do të zbatohen nga palët e treta, përveç që zhvilluesi në fjalë thjesht duhet të shmangë titujt që mund të kenë një qëllim të ndryshëm për t'u përdorur nga serverët, përfaqësuesit ose klientët . Për këtë arsye, shembujt e dhënë "X-Gzip/Gzip" dhe "X-Forwarded-For/Forwarded-For" janë të diskutueshme. Ekziston një pyetje në lidhje me konventat në kontekstin e një API private, të ngjashme me konventat e emërtimit për parametrat e pyetjes së URL-së. Bëhet fjalë për preferencë dhe distancë midis emrave; shqetësimet në lidhje me "X-ClientDataFoo" të mbështetur nga çdo përfaqësues ose ofrues pa "X" janë qartazi të gabuara.

Nuk ka asgjë të veçantë apo magjike në lidhje me parashtesën "X-", por ndihmon për të kuptuar se ky është një titull me porosi. Në fakt, RFC-6648 dhe të tjerët ndihmojnë në parandalimin e përdorimit të prefiksit "X-" sepse - ndërsa shitësit e klientëve dhe serverëve HTTP heqin prefiksin - aplikacionet tuaja, API-të private, të dhënat personale, mekanizmi i transferimit izolohen edhe më mirë nga përplasjet midis emrave. dhe një numër i vogël titujsh zyrtarë të rezervuar. Megjithatë, preferenca dhe rekomandimi im personal është të shkosh një hap më tej dhe të bësh "X-ACME-ClientDataFoo" për shembull (nëse kompania juaj e Widget është "ACME").

IMHO specifikimi IETF nuk është mjaftueshëm specifik për t'iu përgjigjur pyetjes së OP-së pasi nuk arrin të bëjë dallimin midis rasteve krejtësisht të ndryshme të përdorimit: (A) shitësit që zbatojnë veçori të reja globalisht të zbatueshme si "Përcjellur-Për" nga njëra anë kundrejt. (B) zhvilluesit e aplikacioneve kalojnë vargjet specifike të aplikacionit te klienti dhe serveri. Spektri prek vetëm të parën, (A). Pyetja këtu është nëse ka konventa për (B). ka. Këto përfshijnë grupimin e parametrave në mënyrë alfabetike dhe ndarjen e tyre nga shumë tituj të tipit (A) në përputhje me standardet. Përdorimi i prefiksit "X-" ose "X-ACME-" është i përshtatshëm dhe i ligjshëm për (B) dhe nuk bie ndesh me (A). Sa më shumë shitës të ndalojnë përdorimin e "X-" për (A), aq më i qartë (B) do të bëhet.

Shembull:
Google (që mbajnë pak peshë në trupa të ndryshëm standardesh) - që nga sot, 20141102 në këtë ndryshim të vogël në përgjigjen time - aktualisht përdor "X-Mod-Pagespeed" për të specifikuar versionin e modulit të tyre Apache të përfshirë në konvertimin e një përgjigjeje të dhënë . A sugjeron vërtet dikush që Google duhet të përdorë "Mod-Pagespeed" pa "X-" dhe/ose t'i kërkojë IETF të bekojë përdorimin e tij?

Përmbledhje:
Nëse jeni duke përdorur tituj të personalizuar HTTP (si një alternativë nganjëherë të përshtatshme për cookie-t) në aplikacionin tuaj për të transferuar të dhëna në serverin tuaj, dhe këto tituj nuk synohen qartë të përdoren jashtë kontekstit të aplikacionit tuaj, emrat që përputhen me parashtesën "X-" ose "X- FOO-" është e arsyeshme dhe e pranuar përgjithësisht.

Ne ju ofrojmë një përshkrim të aspekteve kryesore të protokollit HTTP - protokolli i rrjetit, që nga fillimi i viteve '90 e deri më sot, duke lejuar shfletuesin tuaj të ngarkojë faqet e internetit. Ky artikull është shkruar për ata që sapo kanë filluar të punojnë me të rrjetet kompjuterike dhe të zhvillojnë aplikacione rrjeti, dhe për të cilët është ende e vështirë të lexojnë vetë specifikimet zyrtare.

HTTP- një protokoll i përdorur gjerësisht i transferimit të të dhënave, i destinuar fillimisht për transferimin e dokumenteve të hipertekstit (d.m.th., dokumente që mund të përmbajnë lidhje që ju lejojnë të organizoni kalimin në dokumente të tjera).

Shkurtesa HTTP qëndron për Protokolli i Transferimit të Hyper Text, "Protokolli i Transferimit të Hipertekstit". Sipas specifikimeve OSI, HTTP është një protokoll i shtresës së aplikacionit (i sipërm, i 7-të). Versioni aktual i protokollit, HTTP 1.1, përshkruhet në specifikimin RFC 2616.

Protokolli HTTP supozon përdorimin e një strukture të transferimit të të dhënave klient-server. Aplikacioni i klientit formon një kërkesë dhe e dërgon atë në server, pas së cilës softueri i serverit përpunon kërkesë e dhënë, gjeneron një përgjigje dhe ia dërgon atë klientit. Pas kësaj, aplikacioni i klientit mund të vazhdojë të dërgojë kërkesa të tjera, të cilat do të përpunohen në të njëjtën mënyrë.

Detyra që tradicionalisht zgjidhet duke përdorur protokollin HTTP është shkëmbimi i të dhënave midis një aplikacioni përdoruesi që akseson burimet e ueb-it (zakonisht një shfletues ueb) dhe një serveri uebi. Për momentin, është falë protokollit HTTP që sigurohet puna e World Wide Web.

HTTP përdoret gjithashtu shpesh si protokoll komunikimi për protokollet e tjera të shtresave të aplikacionit si SOAP, XML-RPC dhe WebDAV. Në një rast të tillë, protokolli HTTP thuhet se përdoret si "transport".

shumë API produkte softuerike gjithashtu nënkupton përdorimin e HTTP për transferimin e të dhënave - të dhënat në vetvete mund të jenë në çdo format, si XML ose JSON.

Si rregull, transmetimi i të dhënave përmes protokollit HTTP kryhet përmes lidhjeve TCP / IP. Softueri i serverit zakonisht përdor portin TCP 80 (dhe nëse porti nuk është specifikuar në mënyrë eksplicite, atëherë softueri i klientit zakonisht përdor portin 80 si parazgjedhje për hapjen e lidhjeve HTTP), megjithëse çdo port tjetër mund të përdoret.

Si të dërgoni një kërkesë HTTP?

Mënyra më e lehtë për t'u marrë me protokollin HTTP është të përpiqeni të aksesoni manualisht disa burime në internet. Imagjinoni që jeni një shfletues dhe keni një përdorues që me të vërtetë dëshiron të lexojë artikujt e Anatoly Alizar.

Supozoni se ai ka futur sa vijon në shiritin e adresave:

http://alizar.habrahabr.ru/

Prandaj, ju, si një shfletues në internet, tani duhet të lidheni me serverin në internet në alizar.habrahabr.ru.

Për ta bërë këtë, mund të përdorni ndonjë dobi të përshtatshme linja e komandës. Për shembull, telnet:

Telnet alizar.habrahabr.ru 80

Për ta sqaruar menjëherë, nëse ndryshoni mendjen papritur, shtypni Ctrl + "]" dhe më pas futni - kjo do t'ju lejojë të mbyllni lidhjen HTTP. Përveç telnetit, mund të provoni nc (ose ncat) - për shije.

Pasi të lidheni me serverin, duhet të dërgoni një kërkesë HTTP. Kjo, nga rruga, është shumë e lehtë - kërkesat HTTP mund të përbëhen nga vetëm dy rreshta.

Për të formuar një kërkesë HTTP, duhet të hartoni një linjë fillestare, dhe gjithashtu të vendosni të paktën një kokë - ky është titulli i Host, i cili është i detyrueshëm dhe duhet të jetë i pranishëm në çdo kërkesë. Fakti është se konvertimi i një emri domeni në një adresë IP kryhet në anën e klientit, dhe, në përputhje me rrethanat, kur hapni një lidhje TCP, atëherë server në distancë nuk ka asnjë informacion se cila adresë është përdorur për lidhjen: mund të jetë, për shembull, adresa alizar.habrahabr.ru, habrahabr.ru ose m.habrahabr.ru - dhe në të gjitha këto raste përgjigjja mund të jetë e ndryshme. Megjithatë, në fakt lidhje rrjeti në të gjitha rastet, ajo hapet me nyjen 212.24.43.44, dhe edhe nëse fillimisht, kur hapni lidhjen, nuk ishte specifikuar kjo adresë IP, por një emër domaini, serveri nuk informohet në asnjë mënyrë për këtë - dhe kjo është arsyeja pse kjo adresa duhet të kalohet në kokën e Host.

Vargu i pyetjes fillestare (fillestare) për HTTP 1.1 është i përbërë si më poshtë:

Për shembull (një linjë e tillë fillimi mund të tregojë atë që kërkohet Faqja Kryesore faqe):

Dhe, sigurisht, mos harroni se çdo teknologji bëhet shumë më e thjeshtë dhe më e qartë kur filloni ta përdorni atë.

Fat i mirë dhe mësim i lumtur!

Etiketa: Shtoni etiketa



Artikuj të ngjashëm: