Si duket një kërkesë për të marrë. Përdorimi i metodave GET dhe POST
Në ditët e sotme, vetëm dy metoda HTTP përdoren më shpesh: GET dhe POST. Por doli që edhe midis këtyre dy "pishave" zhvilluesit e uebit arrijnë të humbasin. Ka një shpjegim për këtë: të dyja metodat mund të përdoren për të marrë të njëjtin rezultat. Por duhet të kujtojmë se përdorimi i pamenduar i cilësdo prej metodave mund të çojë në pasoja katastrofike, duke përfshirë ngarkesa të rënda në kanal dhe vrimat e sigurisë.
Për të shmangur këtë, mjafton thjesht të kuptoni më në detaje qëllimet dhe dallimet e këtyre metodave.
Nëse gërmoni në kuptimin e emrave të metodave, shumë do të bëhen më të qarta. GET (nga anglishtja për të marrë), d.m.th. duhet të përdoret për të kërkuar të dhëna. POST (nga anglishtja dërgoni me postë) - përdoret për të dërguar të dhëna në server. Gjithçka duket të jetë jashtëzakonisht e thjeshtë dhe e qartë. Por kushdo që dëshiron të zhvillojë uebsajte pak më të komplikuara se një faqe interneti me kartëvizitë me një formular reagimi, është më mirë ta njohë më mirë çështjen.
Kërkesa të sigurta dhe të pasigurta HTTP
Specifikimi HTTP 1.1 prezanton dy koncepte: kërkesë e sigurt dhe e pasigurt, ose më saktë, metodë.
Metodat e sigurta janë metoda që mund të kërkojnë vetëm informacion. Ata nuk mund të ndryshojnë burimin e kërkuar, as nuk mund të çojnë në rezultate të padëshirueshme për përdoruesin, të tjerët ose serverin. Shembuj të sigurt janë duke kërkuar kodin HTML të një faqeje interneti ose imazhi. Metodat e sigurta përfshijnë HEAD dhe GET.
Shënimi
Në realitet, zejtarët, natyrisht, mund të shkaktojnë dëm me kërkesat GET. Për shembull, unazat e pyetjeve.
Pyetjet e pasigurta, siç të gjithë e kanë hamendësuar tashmë, mund të çojnë në pasoja të këqija nëse ato përdoren përsëri. Kërkesa të tilla mund të ndryshojnë përmbajtjen e burimit që aksesohet. Shembuj të kërkesave të tilla: dërgimi i mesazheve, regjistrimi, pagesa online. Metodat e pasigurta përfshijnë POST, PUT, DELETE.
Metodat idempotente
Idempotenca është një veti e metodave që, me thirrje të shumta të përsëritura, do të japin të njëjtin rezultat, përveç rasteve kur informacioni është i vjetëruar. Kjo do të thotë që kur hyni në të njëjtën URL, të gjithë përdoruesit do të shohin të njëjtën faqe në internet, imazh, video, etj. Metodat GET, PUT, DELETE e kanë këtë veti.
Tani le të hedhim një vështrim më të afërt në vetë metodat GET dhe POST: le të shkruajmë një "përmbledhje" të shkurtër për secilën.
MARR
- projektuar për të marrë të dhëna nga serveri;
- trupi i kërkesës është bosh;
- përpunohet në anën e serverit më shpejt dhe me më pak konsum të burimeve të serverit për shkak të trupit bosh të kërkesës;
- transferimi i variablave ndodh në shiritin e adresave (kështu e sheh përdoruesi; teknikisht, të dhënat transmetohen në rreshtin e pyetjes) dhe për këtë arsye informacioni në lidhje me variablat dhe vlerat e tyre është i dukshëm (të dhënat nuk janë të mbrojtura);
- është në gjendje të transferojë një sasi të vogël të dhënash në server: ka kufizime në gjatësinë e URL-së, e cila varet nga shfletuesi, për shembull, IE6 = 2Kb. Zhvilluesit e Yahoo! rekomandojnë të përqendrohen në këtë numër;
- mund të transmetojë vetëm karaktere ASCII;
- një kërkesë e tillë mund të kopjohet dhe ruhet (për shembull, në faqerojtësit);
- kërkesa mund të ruhet në memorie (kjo mund të kontrollohet);
- për të reduktuar më tej ngarkesën në kanal dhe server, ofrohen kërkesa të kushtëzuara dhe të pjesshme;
- nuk e prish lidhjen HTTP (nëse modaliteti keepAlive është i aktivizuar në server).
POST
- të destinuara për dërgimin e të dhënave në server;
- transferimi i të dhënave ndodh në trupin e kërkesës;
- Përpunimi nga serveri është më i ngadalshëm dhe "më i rëndë" se GET, sepse përveç titujve, trupi i kërkesës duhet të analizohet;
- të aftë për të transmetuar sasi të mëdha të dhënash;
- të aftë për të transferuar skedarë;
- një faqe e krijuar nga metoda POST nuk mund të ruhet si faqerojtës;
- prish lidhjen HTTP;
- Për të transmetuar qoftë edhe një sasi shumë të vogël informacioni, shumica e shfletuesve dërgojnë të paktën dy paketa TCP: një kokë dhe më pas një pjesë të kërkesës.
Rezulton se këto dy metoda nuk janë aq të ngjashme. Përdorimi i njërës ose tjetrës duhet të përcaktohet nga detyra në fjalë, dhe jo nga fakti që GET përdoret si parazgjedhje ose është më e lehtë për të punuar me të. GET, natyrisht, është një opsion më i mirë në shumicën e rasteve, veçanërisht kur ndërtoni AJAX të shpejtë, por mos harroni për disavantazhet e tij. Për veten time, bëra një shënim të thjeshtë algoritmi për zgjedhjen e një metode.
Ky postim është një përgjigje për një pyetje të bërë në një nga artikujt e mi.
Në këtë artikull dua t'ju tregoj se cilat janë metodat HTTP GET/POST/PUT/DELETE dhe të tjera, pse u shpikën dhe si t'i përdorni ato në përputhje me REST.
HTTP
Pra, cili është një nga protokollet kryesore të internetit? Unë do t'i dërgoj pedantët në RFC2616, dhe do t'i tregoj të tjerët në mënyrë njerëzore :)Ky protokoll përshkruan ndërveprimin ndërmjet dy kompjuterëve (klientit dhe serverit), i ndërtuar mbi bazën e mesazheve të quajtura kërkesë (Kërkesë) dhe përgjigje (Përgjigje). Çdo mesazh përbëhet nga tre pjesë: një linjë fillestare, kokë dhe një trup. Në këtë rast, kërkohet vetëm vija e fillimit.
Linjat e fillimit për kërkesën dhe përgjigjen kanë formate të ndryshme - ne jemi të interesuar vetëm për vijën fillestare të kërkesës, e cila duket si kjo:
METODA URI HTTP/ VERSION ,
Aty ku METHOD është metoda e kërkesës HTTP, URI është identifikuesi i burimit, VERSIONI është versioni i protokollit (aktualisht versioni 1.1 është aktual).
Titujt janë një koleksion çiftesh emër-vlerë të ndara me dy pika. Titujt përcjellin informacione të ndryshme të shërbimit: kodimin e mesazhit, emrin dhe versionin e shfletuesit, adresën nga erdhi klienti (Referruesi) dhe kështu me radhë.
Trupi i mesazhit është të dhënat aktuale që transmetohen. Në përgjigje, të dhënat e transmetuara janë zakonisht faqja HTML që kërkoi shfletuesi, dhe në kërkesë, për shembull, në trupin e mesazhit, transmetohet përmbajtja e skedarëve të ngarkuar në server. Por, si rregull, nuk ka fare organ mesazhi në kërkesë.
Shembull i ndërveprimit HTTP
Le të shohim një shembull.Kërkesë:
GET /index.php HTTP/1.1 Pritësi: shembull.com Agjenti i përdoruesit: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Prano: tekst/html Lidhja: mbyll
Rreshti i parë është linja e pyetjes, pjesa tjetër janë kokë; trupi i mesazhit mungon
Përgjigje:
HTTP/1.0 200 OK Serveri: nginx/0.6.31 Përmbajtja-Gjuha: ru Lloji i Përmbajtjes: tekst/html; charset=utf-8 Përmbajtja-Gjatësia: 1234 Lidhja: mbyll ... VETË FAQJA HTML...
Burimet dhe metodat
Le të kthehemi në vijën fillestare të kërkesës dhe të kujtojmë se ajo përmban një parametër të tillë si URI. Kjo qëndron për Uniform Resource Identifier - një identifikues uniform i burimit. Një burim është, si rregull, një skedar në server (një shembull URI në këtë rast është "/styles.css"), por në përgjithësi një burim mund të jetë gjithashtu një objekt abstrakt ("/blogs/webdev/" - pikë në zhvillimin e bllokut "Ueb"" dhe jo në një skedar specifik).Lloji i kërkesës HTTP (i quajtur edhe metoda HTTP) i tregon serverit se çfarë veprimi duam të kryejmë në burim. Fillimisht (në fillim të viteve '90) supozohej se klienti mund të dëshironte vetëm një gjë nga një burim - ta merrte atë, por tani duke përdorur protokollin HTTP mund të krijoni postime, të modifikoni një profil, të fshini mesazhe dhe shumë më tepër. Dhe këto veprime janë të vështira për t'u kombinuar me termin "faturë".
Për të dalluar veprimet nga burimet në nivelin e metodave HTTP, u shpikën opsionet e mëposhtme:
- GET - marrja e një burimi
- POST - krijimi i burimeve
- PUT - përditësimi i burimeve
- FSHIJE - fshirja e një burimi
REST hyn në lojë
REST (Representational State Transfer) është një term i prezantuar në vitin 2000 nga Roy Fielding, një nga zhvilluesit e protokollit HTTP, si emri i një grupi parimesh për ndërtimin e aplikacioneve në ueb. Në përgjithësi, REST mbulon një zonë më të gjerë se HTTP - mund të përdoret gjithashtu në rrjete të tjera me protokolle të tjera. REST përshkruan parimet e ndërveprimit midis klientit dhe serverit, bazuar në konceptet e "burimit" dhe "foljes" (mund të kuptohet si temë dhe kallëzues). Në rastin e HTTP, burimi identifikohet nga URI i tij, dhe folja është metoda HTTP.REST sugjeron braktisjen e përdorimit të së njëjtës URI për burime të ndryshme (d.m.th., adresat e dy artikujve të ndryshëm si /index.php?article_id=10 dhe /index.php?article_id=20 - kjo nuk është një mënyrë REST) dhe duke përdorur metoda të ndryshme HTTP për veprime të ndryshme. Kjo do të thotë, një aplikacion në internet i shkruar duke përdorur qasjen REST do të fshijë një burim kur e akseson atë me metodën HTTP DELETE (natyrisht, kjo nuk do të thotë që është e nevojshme të jepet mundësia për të fshirë gjithçka dhe të gjithë, por ndonjë kërkesa për fshirje e aplikacionit duhet të përdorë metodën HTTP DELETE).
REST u jep programuesve mundësinë për të shkruar aplikacione ueb të standardizuara dhe pak më të bukura se më parë. Duke përdorur REST, URI për të shtuar një përdorues të ri nuk do të jetë /user.php?action=create (metoda GET/POST), por thjesht /user.php (metoda strikte POST).
Si rezultat, duke kombinuar specifikimet ekzistuese HTTP dhe qasjen REST, metoda të ndryshme HTTP më në fund kanë kuptim. GET - kthen një burim, POST - krijon një të ri, PUT - përditëson një ekzistues, DELETE - e fshin atë.
Probleme?
Po, ka një problem të vogël me përdorimin e REST në praktikë. Ky problem quhet HTML.Kërkesat PUT/DELETE mund të dërgohen duke përdorur XMLHttpRequest, duke kontaktuar serverin manualisht (të themi, nëpërmjet curl ose edhe nëpërmjet telnet), por nuk mund të bëni një formë HTML që dërgon një kërkesë të plotë PUT/DELETE.
Çështja është se specifikimi HTML nuk ju lejon të krijoni forma që dërgojnë të dhëna të tjera përveçse nëpërmjet GET ose POST. Prandaj, për të punuar normalisht me metoda të tjera, duhet t'i imitoni ato në mënyrë artificiale. Për shembull, në Rack (mekanizmi në bazë të të cilit Ruby ndërvepron me serverin në internet; Rails, Merb dhe korniza të tjera Ruby bëhen duke përdorur Rack), mund të shtoni një fushë të fshehur në formular me emrin "_method", dhe specifikoni emrin e metodës si vlerë (p.sh. "PUT") - në këtë rast, një kërkesë POST do të dërgohet, por Rack do të jetë në gjendje të pretendojë se ka marrë një PUT dhe jo një POST.
Sot doja të thellohesha pak në gjëra primitive dhe të përshkruaj atë që mund të gjendet në World Wide Web në sasi të mëdha dhe pa shumë vështirësi. Do të flasim praktikisht për të shenjtën e protokollit HTTP: kërkesat POST dhe GET.
Shumë do të pyesin pse? Unë do të përgjigjem shkurt dhe qartë: jo të gjithë e dinë se çfarë është dhe pse është e nevojshme, dhe ata që duan të mësojnë për të (ndërsa kuptojnë pak në fushën e IT) shpesh nuk mund të kuptojnë se çfarë shkruhet në shumë e shumë artikuj kushtuar kësaj. temë. Do të përpiqem të shpjegoj me gishta se çfarë janë kërkesat POST dhe GET dhe për çfarë përdoren ato.
Pra, le të fillojmë udhëtimin tonë në një përrallë ...
Nëse jeni duke e lexuar këtë mesazh, atëherë të paktën e dini se si duket interneti dhe çfarë është një faqe interneti. Duke lënë jashtë të gjitha ndërlikimet e punës së World Wide Web, ne do të operojmë me koncepte të tilla si përdorues dhe sajt. Çfarëdo që mund të thuhet, këto dy entitete duhet disi të ndërveprojnë me njëri-tjetrin. Për shembull, njerëzit komunikojnë me njëri-tjetrin përmes gjesteve, emocioneve dhe të folurit, kafshët nxjerrin disa tinguj, por çfarë ndodh kur një person dhe një burim në internet "komunikojnë"? Këtu kemi një rast shkëmbimi informacioni, i cili mund të transferohet në një bisedë njerëzore “Pyetje-Përgjigje”. Për më tepër, si përdoruesi ashtu edhe faqja mund të bëjnë pyetje dhe përgjigje. Kur flasim për një faqe interneti, pyetjet dhe përgjigjet e saj, si rregull, shprehen gjithmonë në formën e një faqe interneti me një tekst ose një tjetër. Kur bëhet fjalë për përdoruesin, atëherë gjithçka ndodh falë kërkesave GET dhe POST (sigurisht jo vetëm, por po flasim për to).
Kështu, zbuluam se objektet tona tematike janë të nevojshme për të "komunikuar" me faqet. Për më tepër, të dyja kërkesat GET dhe POST mund të përdoren për t'i "bërë pyetje" sajtit dhe për t'u "përgjigjur" atyre. Si janë të ndryshëm? Gjithçka është mjaft e thjeshtë. Sidoqoftë, për të shpjeguar ndryshimet, do të duhet të shqyrtojmë një shembull, për të cilin do të marrim faqen e një plani të dyqanit në internet.
Ju ndoshta keni vënë re shpesh kur po kërkoni diçka në dyqanet në internet që kur kërkoni duke përdorur filtra, adresa e faqes kthehet nga "http://magaazin.ru" e bukur në "http://magaazin.ru/?kategoria" e frikshme = këpucë dhe madhësia = 38". Pra, çdo gjë që vjen pas simbolit '?' është kërkesa juaj GET ndaj sajtit, dhe për të qenë plotësisht i saktë, në këtë rast ju po pyesni faqen se çfarë ka në kategorinë "Këpucët" nga madhësitë "38" (ky shembull) është hequr nga koka ime, në realitet gjithçka mund të mos duket aq e qartë). Si rezultat, ne mund të bëjmë vetë pyetje duke i treguar ato në shiritin e adresave të faqes. Natyrisht, kjo metodë ka disa disavantazhe. Së pari, kushdo që është pranë përdoruesit në kompjuter mund të spiunojë lehtësisht të gjitha të dhënat, kështu që përdorimi i këtij lloji të kërkesës për të transferuar fjalëkalime është shumë i padëshirueshëm. Së dyti, ka një kufizim në gjatësinë e vargut që mund të transferohet nga fusha e adresës së faqes, që do të thotë se nuk do të jetë e mundur të transferohen shumë të dhëna. Sidoqoftë, përparësia e padyshimtë e përdorimit të kërkesave GET është lehtësia e përdorimit dhe aftësia për të kërkuar shpejt faqen, e cila është veçanërisht e dobishme gjatë zhvillimit, por kjo është një histori tjetër...
Tani le të flasim për kërkesat POST. Lexuesit e zgjuar mund të kenë kuptuar se ndryshimi kryesor midis kësaj kërkese dhe homologut të saj është fshehtësia e të dhënave të transmetuara. Nëse marrim parasysh një dyqan online, një shembull i mrekullueshëm ku përdoret një kërkesë POST është regjistrimi në sit. Faqja kërkon të dhënat tuaja, ju i plotësoni këto të dhëna dhe kur klikoni në butonin “Regjistrim” dërgoni përgjigjen tuaj. Për më tepër, këto të dhëna nuk do të shfaqen në asnjë mënyrë nga jashtë. Vlen gjithashtu të theksohet se mund të kërkohet një sasi mjaft e madhe informacioni - por kërkesa POST nuk ka kufizime. Epo, nëse prekni minusin, atëherë një kërkesë e tillë nuk mund të gjenerohet shpejt. Ju nuk mund ta bëni këtë pa aftësi të veçanta. Edhe pse në realitet gjithçka nuk është aq e vështirë, por përsëri, kjo është një histori tjetër.
Le të përmbledhim. Kërkesat POST dhe GET nevojiten për "komunikim" midis përdoruesit dhe sajtit. Ato janë në thelb pothuajse e kundërta e njëra-tjetrës. Përdorimi i disa llojeve të pyetjeve varet nga situata specifike dhe përdorimi i vetëm një lloji të pyetjeve është jashtëzakonisht i papërshtatshëm.
Ky postim ka për qëllim të shpjegojë parimet e transmetimit të të dhënave në internet duke përdorur dy metoda kryesore: GET dhe POST. E shkrova si një shtesë të udhëzimeve për gjeneratorin e orarit të ndërrimeve për ata që nuk kanë gjasa të jenë të interesuar për detajet ☺.
Shkoni në adresën e mëposhtme (kjo është për një shpjegim vizual): http://calendarin.net/calendar.php?year=2016 Kushtojini vëmendje shiritit të adresave të shfletuesit: calendarin.net/calendar.php ?vit=2016 Skedari kryesor emërtohet i ndjekur nga një pikëpyetje (?) dhe një parametër "viti" me vlerën "2016". Pra, gjithçka që pason pikëpyetjen është një kërkesë GET. Është e thjeshtë. Për të kaluar më shumë se një parametër, ata duhet të ndahen me një ampersand (&). Shembull: calendarin.net/calendar.php ?viti=2016&display=ditët-punë-dhe-ditët e pushimit
Skedari kryesor është ende i emërtuar, i ndjekur nga një pikëpyetje (?), më pas një parametër "vit" me vlerën "2016", më pas një ampersand (&), më pas një parametër "shfaqje" me vlerën "ditët e punës- dhe-ditë” -off”.
Parametrat GET mund të ndryshohen drejtpërdrejt në shiritin e adresave të shfletuesit. Për shembull, ndryshimi i vlerës "2016" në "2017" dhe shtypja e tastit do t'ju çojë në kalendarin për 2017.
Ky është një transferim i fshehur i të dhënave (adresa e faqes nuk ndryshon); domethënë, ju mund të shihni vetëm atë që u transferua duke përdorur një program (skript). Për shembull, në mjetin e mëposhtëm për numërimin e karaktereve në tekst, të dhënat origjinale transmetohen duke përdorur metodën POST: http://usefulonlinetools.com/free/character-counter.php
Nëse keni ndonjë pyetje, komente dhe emaili im është në shërbimin tuaj.
Përveç metodës GET, të cilën e diskutuam në postimin 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ë kontaktuar serverin duke përdorur metodën GET, na duhej vetëm të shkruanim një kërkesë në URL, atëherë në metodën POST gjithçka funksionon në një parim tjetër.
Për të ekzekutuar këtë lloj kërkese, duhet të klikojmë në butonin me atributin type="submit", i cili ndodhet në faqen e internetit. Ju lutemi vini re se ky buton ndodhet në element
Nëse përdoruesi fut një tekst në fushën e tekstit dhe klikon në butonin "Dërgo", ndryshorja e tekstit do të dërgohet në server me vlerën e përmbajtjes që përdoruesi ka futur.
Kërkesat POST dhe GET me fjalë të thjeshta
Kjo variabël do të dërgohet duke përdorur metodën POST.
Nëse e shkruani formularin si kjo: