Kā izskatās saņemšanas pieprasījums. Izmantojot GET un POST metodes

Mūsdienās visbiežāk tiek izmantotas tikai divas HTTP metodes: GET un POST. Taču izrādījās, ka pat starp šīm divām “priedēm” tīmekļa izstrādātājiem izdodas apmaldīties. Tam ir izskaidrojums: abas metodes var izmantot, lai iegūtu vienu un to pašu rezultātu. Taču jāatceras, ka jebkuras metodes nepārdomāta izmantošana var radīt postošas ​​sekas, tostarp lielas slodzes uz kanālu un drošības caurumiem.

Lai no tā izvairītos, pietiek vienkārši sīkāk izprast šo metožu mērķus un atšķirības.

Ja iedziļināsies metožu nosaukumu nozīmē, daudz kas kļūs skaidrāks. GET (no angļu valodas uz saņemt), t.i. jāizmanto datu vaicāšanai. POST (no angļu valodas send pa pastu) - izmanto datu nosūtīšanai uz serveri. Šķiet, ka viss ir ārkārtīgi vienkārši un skaidri. Bet, kurš vēlas izstrādāt vietnes, kas ir nedaudz sarežģītākas nekā vizītkaršu vietne ar vienu atsauksmju veidlapu, labāk ir labāk iepazīt šo problēmu.

Droši un nedroši HTTP pieprasījumi

HTTP 1.1 specifikācija ievieš divus jēdzienus: drošs un nedrošs pieprasījums vai precīzāk, metode.

Drošas metodes ir metodes, kas var tikai pieprasīt informāciju. Tie nevar mainīt pieprasīto resursu, kā arī nevar radīt nevēlamus rezultātus lietotājam, citiem vai serverim. Drošu piemēri ir tīmekļa lapas vai attēla HTML koda pieprasīšana. Drošas metodes ietver HEAD un GET.

Piezīme

Patiesībā amatnieki, protams, var nodarīt kaitējumu ar GET pieprasījumiem. Piemēram, vaicājumu cilpas.

Nedroši vaicājumi, kā visi jau ir uzminējuši, var izraisīt sliktas sekas, ja tos izmantos atkārtoti. Šādi pieprasījumi var mainīt pieejamā resursa saturu. Šādu pieprasījumu piemēri: ziņojumu sūtīšana, reģistrācija, tiešsaistes maksājumi. Nedrošās metodes ietver POST, PUT, DELETE.

Idempotentas metodes

Idempotence ir metožu īpašība, kas ar daudziem atkārtotiem izsaukumiem atgriezīs to pašu rezultātu, izņemot gadījumus, kad informācija ir novecojusi. Tas nozīmē, ka, piekļūstot vienam un tam pašam URL, visi lietotāji redzēs vienu un to pašu tīmekļa lapu, attēlu, video utt. Šī īpašība ir metodēm GET, PUT, DELETE.

Tagad sīkāk aplūkosim pašas GET un POST metodes: uzrakstīsim katrai īsu “kopsavilkumu”.

GŪT

  • paredzēts datu saņemšanai no servera;
  • pieprasījuma pamatteksts ir tukšs;
  • apstrādāts servera pusē ātrāk un ar mazāku servera resursu patēriņu tukšā pieprasījuma korpusa dēļ;
  • mainīgo lielumu pārsūtīšana notiek adreses joslā (tā to redz lietotājs; tehniski dati tiek pārsūtīti vaicājuma rindā) un tāpēc ir redzama informācija par mainīgajiem un to vērtībām (dati nav aizsargāti);
  • spēj pārsūtīt uz serveri nelielu datu apjomu: ir ierobežojumi URL garumam, kas ir atkarīgs no pārlūkprogrammas, piemēram, IE6 = 2Kb. Yahoo! izstrādātāji iesaka koncentrēties uz šo numuru;
  • var pārsūtīt tikai ASCII rakstzīmes;
  • šādu pieprasījumu var nokopēt un saglabāt (piemēram, grāmatzīmēs);
  • pieprasījumu var saglabāt kešatmiņā (to var kontrolēt);
  • lai vēl vairāk samazinātu kanāla un servera slodzi, ir pieejami nosacījumi un daļēji pieprasījumi;
  • nepārtrauc HTTP savienojumu (ja serverī ir iespējots KeepAlive režīms).

POSTĪT

  • paredzēts datu nosūtīšanai uz serveri;
  • datu pārsūtīšana notiek pieprasījuma pamattekstā;
  • servera puses apstrāde ir lēnāka un “smagāka” nekā GET, jo papildus galvenēm ir jāanalizē arī pieprasījuma pamatteksts;
  • spēj pārsūtīt lielu datu apjomu;
  • spēj pārsūtīt failus;
  • ar POST metodi ģenerētu lapu nevar saglabāt kā grāmatzīmes;
  • pārtrauc HTTP savienojumu;
  • Lai pārsūtītu pat ļoti nelielu informācijas apjomu, lielākā daļa pārlūkprogrammu nosūta vismaz divas TCP paketes: galveni un pēc tam pieprasījuma pamattekstu.

Izrādās, ka šīs divas metodes nav tik līdzīgas. Viena vai otra izmantošana ir jānosaka pēc veicamā uzdevuma, nevis tam, vai GET tiek izmantots pēc noklusējuma vai ar to ir vieglāk strādāt. GET, protams, vairumā gadījumu ir labāks risinājums, it īpaši, veidojot ātru AJAX, taču neaizmirstiet par tā trūkumiem. Es sev izveidoju vienkāršu algoritmu-piezīmi par metodes izvēli.

Šī ziņa ir atbilde uz jautājumu, kas uzdots vienā no maniem rakstiem.

Šajā rakstā vēlos pastāstīt, kas ir HTTP metodes GET/POST/PUT/DELETE un citas, kāpēc tās tika izgudrotas un kā tās izmantot saskaņā ar REST.

HTTP

Tātad, kāds ir viens no galvenajiem interneta protokoliem? Pedantus nosūtīšu uz RFC2616, pārējo pastāstīšu cilvēcīgi :)

Šis protokols apraksta mijiedarbību starp diviem datoriem (klientu un serveri), kas veidota, pamatojoties uz ziņojumiem, ko sauc par pieprasījumu (Request) un atbildi (Response). Katrs ziņojums sastāv no trim daļām: sākuma līnijas, galvenes un pamatteksta. Šajā gadījumā ir nepieciešama tikai starta līnija.

Pieprasījuma un atbildes sākuma rindiņām ir dažādi formāti - mūs interesē tikai pieprasījuma sākuma līnija, kas izskatās šādi:

METODES URI HTTP/ VERSIJA ,

Kur METHOD ir HTTP pieprasījuma metode, URI ir resursa identifikators, VERSION ir protokola versija (pašreizējā versija ir 1.1).

Virsraksti ir nosaukumu un vērtību pāru kolekcija, kas atdalīta ar kolu. Virsraksti sniedz dažādu pakalpojumu informāciju: ziņojuma kodējumu, pārlūkprogrammas nosaukumu un versiju, adresi, no kuras klients nāca (novirzītājs) un tā tālāk.

Ziņojuma pamatteksts ir faktiskie pārsūtāmie dati. Atbildē pārsūtītie dati, kā likums, ir pārlūkprogrammas pieprasītā HTML lapa, un pieprasījumā, piemēram, ziņojuma pamattekstā, tiek pārsūtīts serverī augšupielādēto failu saturs. Taču, kā likums, pieprasījumā vispār nav ziņojuma pamatteksta.

HTTP mijiedarbības piemērs

Apskatīsim piemēru.

Pieprasīt:
GET /index.php HTTP/1.1 Host: example.com Lietotāja aģents: Mozilla/5.0 (X11; U; Linux i686; ru; rv: 1.9b5) Gecko/2008050509 Firefox/3.0b5 Akceptēt: text/html Savienojums: aizvērt
Pirmā rinda ir vaicājuma rinda, pārējās ir galvenes; trūkst ziņojuma pamatteksta

Atbilde:
HTTP/1.0 200 OK Serveris: nginx/0.6.31 Satura valoda: ru Satura veids: text/html; charset=utf-8 Satura garums: 1234 Savienojums: aizvērt ... PATI HTML LAPA...

Resursi un metodes

Atgriezīsimies pieprasījuma sākuma rindiņā un atcerēsimies, ka tajā ir tāds parametrs kā URI. Tas nozīmē Uniform Resource Identifier — vienotu resursu identifikatoru. Resurss parasti ir fails serverī (piemērs URI šajā gadījumā ir “/styles.css”), taču kopumā resurss var būt arī kāds abstrakts objekts (“/blogs/webdev/” - punkti uz “Web” bloka izstrādi”, nevis uz konkrētu failu).

HTTP pieprasījuma veids (saukts arī par HTTP metodi) norāda serverim, kādu darbību mēs vēlamies veikt ar resursu. Sākotnēji (90.gadu sākumā) tika pieņemts, ka klients no resursa var vēlēties tikai vienu lietu - to saņemt, bet tagad, izmantojot HTTP protokolu, var izveidot ierakstus, rediģēt profilu, dzēst ziņas un daudz ko citu. Un šīs darbības ir grūti apvienot ar terminu “kvīts”.

Lai atšķirtu darbības no resursiem HTTP metožu līmenī, tika izgudrotas šādas iespējas:

  • GET - iegūt resursu
  • POST - resursu izveide
  • PUT — resursu atjauninājums
  • DELETE — resursa dzēšana
Lūdzu, ņemiet vērā, ka HTTP specifikācija neprasa, lai serveris saprastu visas metodes (kuru patiesībā ir daudz vairāk nekā 4) - ir nepieciešams tikai GET, kā arī nenosaka serverim, kas tam jādara, saņemot pieprasījumu ar konkrētu metodi. Tas nozīmē, ka serveris, atbildot uz DELETE /index.php HTTP/1.1 pieprasījumu nav pienākuma dzēst servera lapu index.php, tāpat kā GET /index.php HTTP/1.1 pieprasījumam nav pienākuma atgriezt jums index.php lapu, tā var, piemēram, izdzēst :)

Sāk spēlēt REST

REST (REpresentational State Transfer) ir termins, ko 2000. gadā ieviesa Rojs Fīldings, viens no HTTP protokola izstrādātājiem, kā tīmekļa lietojumprogrammu veidošanas principu grupas nosaukumu. Kopumā REST aptver plašāku apgabalu nekā HTTP – to var izmantot arī citos tīklos ar citiem protokoliem. REST apraksta klienta un servera mijiedarbības principus, pamatojoties uz jēdzieniem “resurss” un “darbības vārds” (var saprast kā subjektu un predikātu). HTTP gadījumā resurss tiek identificēts pēc tā URI, un darbības vārds ir HTTP metode.

REST iesaka atteikties no viena un tā paša URI izmantošanas dažādiem resursiem (tas ir, divu dažādu rakstu adreses, piemēram, /index.php?article_id=10 un /index.php?article_id=20 — tas nav REST veids) un izmantojot dažādas HTTP metodes dažādām darbībām. Tas ir, tīmekļa lietojumprogramma, kas rakstīta, izmantojot REST pieeju, izdzēsīs resursu, piekļūstot tam ar HTTP DELETE metodi (tas, protams, nenozīmē, ka ir jādod iespēja izdzēst visu un visus, bet jebkura lietojumprogrammas dzēšanas pieprasījumam ir jāizmanto HTTP DELETE metode).

REST sniedz programmētājiem iespēju rakstīt standartizētas un nedaudz skaistākas tīmekļa lietojumprogrammas nekā iepriekš. Izmantojot REST, jauna lietotāja pievienošanas URI būs nevis /user.php?action=create (GET/POST metode), bet gan vienkārši /user.php (stingri POST metode).

Rezultātā, apvienojot esošo HTTP specifikāciju un REST pieeju, dažādas HTTP metodes beidzot iegūst jēgu. GET - atgriež resursu, POST - izveido jaunu, PUT - atjaunina esošu, DELETE - dzēš.

Problēmas?

Jā, ar REST lietošanu praksē ir neliela problēma. Šo problēmu sauc par HTML.

PUT/DELETE pieprasījumus var nosūtīt, izmantojot XMLHttpRequest, manuāli sazinoties ar serveri (teiksim, caur curl vai pat caur telnet), taču nevar izveidot HTML veidlapu, kas nosūta pilnvērtīgu PUT/DELETE pieprasījumu.

Lieta ir tāda, ka HTML specifikācija neļauj jums izveidot veidlapas, kas iesniedz datus, izņemot, izmantojot GET vai POST. Tāpēc, lai normāli strādātu ar citām metodēm, tās ir mākslīgi jāatdarina. Piemēram, programmā Rack (mehānisms, uz kura pamata Ruby mijiedarbojas ar tīmekļa serveri; Rails, Merb un citi Ruby ietvari tiek veidoti, izmantojot Rack) veidlapai var pievienot slēptu lauku ar nosaukumu "_method" un kā vērtību norādiet metodes nosaukumu (piemēram, "PUT") — šajā gadījumā tiks nosūtīts POST pieprasījums, bet Rack varēs izlikties, ka saņēmis PUT, nevis POST.

Šodien gribēju nedaudz iedziļināties primitīvās lietās un aprakstīt to, ko var atrast globālajā tīmeklī lielos daudzumos un bez lielām grūtībām. Mēs praktiski runāsim par HTTP protokola svētumu: POST un GET pieprasījumiem.

Daudzi jautās, kāpēc? Es atbildēšu īsi un skaidri: ne visi zina, kas tas ir un kāpēc tas ir vajadzīgs, un tie, kas vēlas par to uzzināt (lai gan IT jomā maz saprot), bieži vien nevar saprast, kas rakstīts daudzos, daudzos šim veltītajos rakstos. temats. Mēģināšu ar pirkstiem izskaidrot, kas ir POST un GET pieprasījumi un kam tie tiek izmantoti.
Tātad, sāksim savu ceļojumu pasakā...
Ja lasāt šo ziņojumu, tad vismaz zināt, kā izskatās internets un kas ir interneta vietne. Izlaižot visas globālā tīmekļa darba sarežģītības, mēs darbosimies ar tādiem jēdzieniem kā lietotājs un vietne. Lai ko arī teiktu, šīm divām vienībām ir kaut kādā veidā jāsadarbojas vienai ar otru. Piemēram, cilvēki sazinās savā starpā ar žestiem, emocijām un runu, dzīvnieki izdod kaut kādas skaņas, bet kas notiek, kad “sazinās” cilvēks un interneta resurss? Šeit ir informācijas apmaiņas gadījums, ko var pārnest uz cilvēka sarunu “Jautājums-Atbilde”. Turklāt gan lietotājs, gan vietne var uzdot jautājumus un atbildes. Kad mēs runājam par vietni, tās jautājumi un atbildes, kā likums, vienmēr tiek izteiktas interneta lapas veidā ar vienu vai otru tekstu. Ja runa ir par lietotāju, tad viss notiek pateicoties GET un POST pieprasījumiem (protams ne tikai, bet mēs par tiem runājam).

Tādējādi mēs noskaidrojām, ka mūsu tematiskie objekti ir nepieciešami, lai “sazinātos” ar vietnēm. Turklāt gan GET, gan POST pieprasījumus var izmantot, lai “uzdotu jautājumus” vietnei un “atbildētu” uz tiem. Kā viņi atšķiras? Viss ir pavisam vienkārši. Tomēr, lai izskaidrotu atšķirības, mums būs jāņem vērā piemērs, kuram mēs izmantosim tiešsaistes veikala plāna vietni.
Jūs, iespējams, bieži pamanījāt, meklējot kaut ko tiešsaistes veikalos, ka, meklējot, izmantojot filtrus, vietnes adrese no skaistā “http://magaazin.ru” pārvēršas par biedējošu “http://magaazin.ru/?category = kurpes&izmērs=38". Tātad viss, kas nāk aiz simbola "?", ir jūsu pieprasījums vietnei, un, lai būtu pilnīgi precīzs, šajā gadījumā jūs jautājat vietnei, kas tajā atrodas kategorijā "Apavi" no izmēriem "38" (šis piemērs ir ņemts no manas galvas, patiesībā viss var neizskatīties tik acīmredzami). Rezultātā mēs varam paši uzdot jautājumus, norādot tos vietnes adreses joslā. Acīmredzot šai metodei ir vairāki trūkumi. Pirmkārt, ikviens, kas atrodas blakus lietotājam pie datora, var viegli izspiegot visus datus, tāpēc šāda veida pieprasījumu izmantošana paroļu pārsūtīšanai ir ļoti nevēlama. Otrkārt, ir ierobežots virknes garums, ko var pārsūtīt no vietnes adreses lauka, kas nozīmē, ka nebūs iespējams pārsūtīt daudz datu. Tomēr neapšaubāma GET pieprasījumu izmantošanas priekšrocība ir tās lietošanas vienkāršība un iespēja ātri meklēt vietni, kas ir īpaši noderīga izstrādes laikā, taču tas ir cits stāsts...
Tagad parunāsim par POST pieprasījumiem. Gudri lasītāji, iespējams, ir sapratuši, ka galvenā atšķirība starp šo pieprasījumu un tā ekvivalentu ir pārsūtīto datu slepenība. Ja mēs uzskatām tiešsaistes veikalu, spilgts piemērs, kur tiek izmantots POST pieprasījums, ir reģistrācija vietnē. Vietne pieprasa jūsu datus, jūs aizpildāt šos datus un, noklikšķinot uz pogas “Reģistrēties”, nosūtāt savu atbildi. Turklāt šie dati nekādā veidā netiks parādīti ārēji. Ir arī vērts atzīmēt, ka var pieprasīt diezgan lielu informācijas daudzumu - un POST pieprasījumam nav ierobežojumu. Nu, ja pieskaraties mīnusam, tad šādu pieprasījumu nevar ātri ģenerēt. To nevar izdarīt bez īpašām prasmēm. Lai gan patiesībā viss nav tik sarežģīti, bet tas atkal ir cits stāsts.
Apkoposim. POST un GET pieprasījumi ir nepieciešami “saziņai” starp lietotāju un vietni. Tie būtībā ir gandrīz pretēji viens otram. Dažu vaicājumu veidu izmantošana ir atkarīga no konkrētās situācijas, un tikai viena veida vaicājumu izmantošana ir ārkārtīgi neērta.

Šis ieraksts ir paredzēts, lai izskaidrotu datu pārraides principus internetā, izmantojot divas galvenās metodes: GET un POST. Uzrakstīju to kā papildinājumu maiņu grafika ģeneratora instrukcijai tiem, kurus diez vai interesēs sīkāk ☺.

Dodieties uz šo adresi (tas ir vizuālam skaidrojumam): http://calendarin.net/calendar.php?year=2016 Pievērsiet uzmanību pārlūkprogrammas adreses joslai: calendarin.net/calendar.php ?gads=2016 Galvenais fails tiek nosaukts, aiz tā ir jautājuma zīme (?) un parametrs "year" ar vērtību "2016". Tātad viss, kas seko jautājuma zīmei, ir GET pieprasījums. Tas ir vienkārši. Lai nodotu vairāk nekā vienu parametru, tie ir jāatdala ar & (&). Piemērs: calendarin.net/calendar.php ?year=2016&display=work-days-and-days-off

Galvenais fails joprojām tiek nosaukts, kam seko jautājuma zīme (?), pēc tam parametrs “year” ar vērtību “2016”, tad & (&), pēc tam parametrs “display” ar vērtību “work-days-”. un-dienas" -off".

GET parametrus var mainīt tieši pārlūkprogrammas adreses joslā. Piemēram, mainot vērtību "2016" uz "2017" un nospiežot taustiņu, tiks atvērts 2017. gada kalendārs.

Šī ir slēpta datu pārsūtīšana (lapas adrese nemainās); tas ir, jūs varat redzēt tikai to, kas tika pārsūtīts, izmantojot programmu (skriptu). Piemēram, šajā rīkā rakstzīmju skaitīšanai tekstā sākotnējie dati tiek pārsūtīti, izmantojot POST metodi: http://usefulonlinetools.com/free/character-counter.php

Ja jums ir kādi jautājumi, komentāri un mans e-pasts ir jūsu rīcībā.

Papildus GET metodei, par kuru mēs runājām iepriekšējā ziņojumā, ir vēl viena metode pieprasījuma nosūtīšanai, izmantojot HTTP protokolu - POST metode. Arī praksē ļoti bieži tiek izmantota POST metode.

Ja, lai sazinātos ar serveri, izmantojot GET metodi, mums vajadzēja tikai ievadīt pieprasījumu URL, tad POST metodē viss darbojas pēc cita principa.

Lai izpildītu šāda veida pieprasījumu, mums ir jānoklikšķina uz pogas ar atribūtu type="submit", kas atrodas tīmekļa lapā. Lūdzu, ņemiet vērā, ka šī poga atrodas elementā

, kura metodes atribūts ir iestatīts uz izlikšanu.

Apsveriet šo HTML kodu:

Ievadiet tekstu:


Ja lietotājs teksta laukā ievada kādu tekstu un noklikšķina uz pogas “Iesniegt”, teksta mainīgais tiks nosūtīts uz serveri ar lietotāja ievadītā satura vērtību.

POSTĪT un SAŅEMT pieprasījumus vienkāršiem vārdiem

Šis mainīgais tiks nosūtīts, izmantojot POST metodi.

Ja veidlapu rakstāt šādi:

Pēc tam dati tiks nosūtīti, izmantojot GET metodi.

Ja GET pieprasījuma gadījumā datu apjomu, ko mēs varētu pārsūtīt, ierobežoja pārlūkprogrammas adreses joslas garums, tad POST pieprasījuma gadījumā šāda ierobežojuma nav, un mēs varam pārsūtīt ievērojamas summas. informāciju.

Vēl viena atšķirība starp POST metodi un GET metodi ir tā, ka POST metode slēpj visus mainīgos lielumus, kurus tā nodod, un to vērtības savā pamattekstā (Entity-Body). GET metodes gadījumā tie tika saglabāti pieprasījuma virknē (Request-URI).

Šeit ir piemērs pieprasījumam, kas veikts, izmantojot POST metodi:

POST / HTTP/1.0\r\n
Saimnieks: www.site.ru\r\n
Referents: http://www.site.ru/index.html\r\n
Sīkdatne: ienākumi=1\r\n
Satura veids: Application/x-www-form-urlencoded\r\n
Satura garums: 35\r\n
\r\n
login=Dima&parole=12345

Tādējādi, pārsūtot datus, izmantojot POST metodi, uzbrucējam būs daudz grūtāk tos pārtvert, jo tie ir paslēpti no tieša skata, tāpēc datu pārsūtīšanas POST metode tiek uzskatīta par drošāku metodi.

Turklāt, izmantojot POST metodi, varat pārsūtīt ne tikai tekstu, bet arī multivides datus (attēlus, audio, video). Ir īpašs parametrs Content-Type, kas nosaka pārsūtāmās informācijas veidu.

Un visbeidzot, lai serverī saņemtu datus, kas tika pārsūtīti ar šo metodi, tiek izmantots mainīgais POST.

Šeit ir apstrādes piemērs PHP:

echo $_POST['teksts'];
?>

Pēdējā ierakstā mēs nolēmām, ka pārlūkprogramma (klients) nosūta HTTP pieprasījumus serverim, un serveris nosūta HTTP atbildes klientam. Šie pieprasījumi un atbildes tiek formatētas saskaņā ar noteiktiem noteikumiem. Ir kaut kas līdzīgs sintaksei, kā un kādā secībā tā jāraksta. Ir jābūt stingri noteiktai struktūrai.

Sīkāk apskatīsim šo struktūru, ar kuras palīdzību HTTP protokolā tiek veidoti pieprasījumi un atbildes.

HTTP pieprasījums sastāv no trim galvenajām daļām, kas parādās tālāk norādītajā secībā. Starp galvenēm un ziņojuma pamattekstu ir tukša rindiņa (kā atdalītājs), tā apzīmē rindas plūsmas rakstzīmi.

Tukša virkne (atdalītājs)

Izlikt un saņemt pieprasījumus, kāda ir atšķirība starp tiem un kas ir labāks un kādiem nolūkiem?

ziņojuma pamatteksts (Entity Body) – neobligāts parametrs

Vaicājuma virkne– norāda pārsūtīšanas metodi, URL, kuram jāpiekļūst, un HTTP protokola versiju.

Virsraksti– apraksta ziņojumu kopumu, pārraida dažādus parametrus un citu informāciju un informāciju.

ziņojuma pamatteksts- tie ir paši dati, kas tiek pārsūtīti pieprasījumā. Ziņojuma pamatteksts ir neobligāts parametrs, un tā var nebūt.

Kad mēs saņemam atbildes pieprasījumu no servera, ziņojuma pamatteksts visbiežāk ir tīmekļa lapas saturs. Bet, veicot pieprasījumus serverim, tas dažkārt var būt klāt, piemēram, kad mēs pārsūtām uz serveri tos datus, kurus aizpildījām atsauksmju veidlapā.

Turpmākajās piezīmēs mēs aplūkosim katru pieprasījuma elementu sīkāk.

Apskatīsim, piemēram, vienu reālu pieprasījumu serverim. Esmu iezīmējis katru pieprasījuma daļu ar atšķirīgu krāsu: pieprasījuma rindiņa ir zaļa, galvenes ir oranžas un ziņojuma pamatteksts ir zils.

Pārlūkprogrammas pieprasījums:

Saimnieks: webgyry.info

Sīkfails: wp-settings

Savienojums: saglabāt dzīvu

Nākamajā piemērā ziņojuma pamatteksts jau ir.

Servera atbilde:

Satura veids: teksts/html; charset=UTF-8

Pārsūtīšanas kodējums: gabalos

Savienojums: saglabāt dzīvu

Keep-Alive: taimauts=5

X-Pingback: //webgyry.info/xmlrpc.php

Dokuments bez nosaukuma

Tie ir ziņojumi, kas tiek apmainīti starp klientu un serveri, izmantojot HTTP.

Starp citu, vai vēlaties noskaidrot, vai kādam jūsu vietnes elementam ir jēga, izmantojot Yandex Metrics un Google Analytics “mērķus”?

Noņemiet to, kas nedarbojas, pievienojiet to, kas darbojas, un dubultojiet ieņēmumus.

Kurss par Yandex Metrics mērķu iestatīšanu.

Kurss par Google Analytics mērķu iestatīšanu.

HTTP klients nosūta serverim pieprasījumu pieprasījuma ziņojuma veidā, kura formāts ir šāds:

  • Vaicājuma virkne (obligāti)
  • Virsraksts (neobligāts elements)
  • Tukša virkne (obligāti)
  • Ziņojuma pamatteksts (neobligāts elements)

Apskatīsim katru no šiem elementiem atsevišķi.

Vaicājuma virkne

Pieprasījuma rinda sākas ar metodes marķieri, kam seko pieprasījuma URI un protokola versija. Elementi ir atdalīti viens no otra ar atstarpēm:

Apskatīsim šo elementu sīkāk.

Pieprasījuma metode

Šis elements norāda metodi, kas ir jāizsauc servera pusē norādītajā URI.

HTTP ir astoņas metodes:

  • GALVA
    Izmanto statusa un galvenes virknes iegūšanai no servera, izmantojot URI. Nemaina datus.
  • GŪT
    Izmanto datu saņemšanai no servera norādītajā URI. Nemaina datus.
  • POSTĪT
    Izmanto, lai nosūtītu datus uz serveri (piemēram, izstrādātāja informāciju utt.), izmantojot HTML veidlapas.
  • PUT
    Aizstāj visus iepriekšējos resursa datus ar jaunajiem ielādētajiem datiem.
  • DZĒST
    Dzēš visus pašreizējos datus par URI norādīto resursu.
  • SAVIENOTIES
    Izveido tuneļa savienojumu ar serveri norādītajā URI.
  • IESPĒJAS
    Apraksta norādītā resursa savienojuma īpašības.
  • TRACE
    Nodrošina ziņojumu, kas satur URI norādītā resursa atrašanās vietas atgriešanās izsekošanu.

Pieprasīt URI

URI (vienotais resursa identifikators) ir tā resursa identifikators, kuram tiek nosūtīts pieprasījums. Tālāk ir norādīts visbiežāk izmantotais URI formāts.

‘*’ izmanto, ja HTTP pieprasījums neattiecas uz konkrētu resursu, bet gan uz serveri. Izmanto tikai tad, ja metode nav jāpiemēro resursam. Piemēram,

absolūtaisURI izmanto, ja starpniekserverī tiek veikts HTTP pieprasījums. Starpniekserveris tiek lūgts pārsūtīt pieprasījumu no pieejamās kešatmiņas un atgriež atbildi. Piemēram:

absolūtais_ceļš | avots visbiežāk izmanto.

Mācīšanās strādāt ar GET un POST pieprasījumiem

Tiek pieprasīts konkrēts resurss noteiktā serverī. Piemēram, klients vēlas saņemt resursu no servera, izmantojot portu 80. Resursa adrese ir “www.proselyte.net” un nosūta šādu pieprasījumu:

Vaicājumi galvenes laukos

Galvenes lauki ļauj klientam nosūtīt serverim papildu informāciju par pieprasījumu un sevi. Šie lauki darbojas kā vaicājuma modifikatori.

Zemāk ir saraksts ar svarīgākajiem galvenes laukiem, ko var izmantot:

  • Pieņemt-Charset
  • Pieņemt-kodējums
  • Pieņemt-valoda
  • Autorizācija
  • Gaidīt
  • Ja-Match
  • Ja-Modificēts-Kopš
  • Ja-nav-atbilst
  • Ja-diapazons
  • Ja-Nepārveidots-Kopš
  • Diapazons
  • Referents
  • Lietotāja aģents

Ja vēlamies ieviest savu klientu un savu tīmekļa serveri, tad varam izveidot savus galvenes laukus.

HTTP pieprasījuma piemērs

Tas noslēdz mūsu HTTP pieprasījumu pētījumu.
Nākamajā rakstā mēs apskatīsim HTTP atbildes.

Viens no veidiem, kā serverim var nosūtīt HTTP pieprasījumu, ir GET pieprasījums. Šī metode ir visizplatītākā, un, izmantojot to, visbiežāk tiek nosūtīti pieprasījumi serverim.

Vienkāršākais veids, kā izveidot GET pieprasījumu, ir ievadīt URL pārlūkprogrammas adreses joslā.

Pārlūkprogramma nosūtīs serverim aptuveni šādu informāciju:

GET / HTTP/1.1
Saimnieks: webgyry.info
Lietotāja aģents: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0
Pieņemt: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Pieņemt valodu: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Pieņemt-kodējums: gzip, deflācija
Sīkfails: wp-settings
Savienojums: saglabāt dzīvu

Pieteikums sastāv no divām daļām:

1. Pieprasījuma līnija

2. Ziņojumu galvenes

Ņemiet vērā, ka GET pieprasījumam nav ziņojuma pamatteksta. Bet tas nenozīmē, ka ar tā palīdzību mēs nevaram pārsūtīt uz serveri nekādu informāciju.

Atšķirība starp GET un POST metodēm

To var izdarīt, izmantojot īpašus GET parametrus.

Lai pieprasījumam pievienotu GET parametrus, URL beigās ir jāpievieno “?”. un pēc tam sāciet jautāt viņiem saskaņā ar šādu noteikumu:

parametra_nosaukums1=parametra_vērtība1& parametra_nosaukums2=parametra_vērtība2&…

Parametru atdalītājs ir “&” zīme.

Piemēram, ja mēs vēlamies serverim nodot divas vērtības, lietotājvārdu un viņa vecumu, tad to var izdarīt ar šādu rindu:

http://site.ru/page.php?name=dima&age=27

Kad šis pieprasījums tiek izpildīts, dati nonāk tā sauktajā vides mainīgajā QUERY_STRING, no kura tos var izgūt serverī, izmantojot servera puses tīmekļa programmēšanas valodu.

Šeit ir piemērs, kā to var izdarīt PHP.

echo "Tavs vārds: " . $_GET["vārds"] . "
»;
atbalss "Tavs vecums: " . $_GET["vecums"] . "
»;
?>

$_GET["parameter_name"] konstrukcija ļauj parādīt nodotā ​​parametra vērtību.

Šī koda izpildes rezultātā pārlūkprogrammā tiks parādīts:

Tavs vārds: dima
Tavs vecums: 27

Mēs arī iesniedzam pieprasījumu serverim, izmantojot GET metodi.

Pirmā metode PHP POST pieprasījuma izpildei ir izmantot file_get_contents . Otrā metode izmantos fread kombinācijā ar pāris citām funkcijām. Abās opcijās tiek izmantota funkcija stream_context_create, lai aizpildītu nepieciešamos pieprasījuma galvenes laukus.

Koda skaidrojums

Mainīgais $sPD satur pārsūtāmos datus. Tam ir jābūt HTTP pieprasījuma virknes formātā, tāpēc dažām īpašām rakstzīmēm ir jābūt kodētām.

Gan funkcijā file_get_contents, gan funkcijā fread mums ir divi jauni parametri. Pirmais ir use_include_path . Tā kā mēs veicam HTTP pieprasījumu, abos piemēros tas būs nepatiess. Ja ir iestatīta vērtība True, lai lasītu vietējo resursu, funkcija meklēs failu ar include_path .

Otrais parametrs ir konteksts, kas tiek aizpildīts ar stream_context_create atgriešanās vērtību, kas iegūst $aHTTP masīva vērtību.

File_get_contents izmantošana, lai veiktu POST pieprasījumus

Lai nosūtītu POST pieprasījumu, izmantojot file_get_contents PHP, jums ir jāizmanto stream_context_create, lai manuāli aizpildītu galvenes laukus un norādītu, kuru "iesaiņojumu" izmantot — šajā gadījumā HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST dati $aHTTP = array("http" => // Iesaiņotājs, kas tiks izmantots array("method" => "POST", // Pieprasījuma metode // Pieprasījuma galvenes ir iestatītas zem "header" => "Saturs - tips: application/x-www-form-urlencoded", "saturs" => $sPD)); $konteksts = straumes_konteksta_izveide($aHTTP); $contents = file_get_contents($sURL, false, $konteksts); atbalss $saturs;

Fread izmantošana POST pieprasījumu veikšanai

Varat izmantot fread funkciju, lai veiktu POST pieprasījumus. Šajā piemērā tiek izmantots stream_context_create, lai izveidotu nepieciešamās HTTP pieprasījuma galvenes:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST dati $aHTTP = array("http" => // Iesaiņotājs, kas tiks izmantots array("method" => "POST", // Pieprasījuma metode // Pieprasījuma galvenes ir iestatītas zem "header" => "Saturs - tips: application/x-www-form-urlencoded", "saturs" => $sPD)); $konteksts = straumes_konteksta_izveide($aHTTP); $rokturis = fopen($sURL, "r", false, $konteksts); $contents = ""; while (!feof($handle)) ( $contents .= fread($handle, 8192); ) fclose($handle); atbalss $saturs;

GET pieprasījumu veikšana, izmantojot PHP

Tagad mēs koncentrēsimies uz fread un file_get_contents izmantošanu, lai lejupielādētu saturu no interneta, izmantojot HTTP un HTTPS. Lai izmantotu šajā rakstā aprakstītās metodes, ir jāiespējo opcija fopen wrappers. Lai to izdarītu, failā php.ini ir jāiestata parametrs allow_url_fopen uz On.

POST un GET pieprasījumu izpilde PHP tiek izmantota, lai pieteiktos vietnēs, izgūtu tīmekļa lapu saturu vai pārbaudītu jaunas lietojumprogrammu versijas. Mēs apskatīsim, kā veikt vienkāršus HTTP pieprasījumus.

Fread izmantošana, lai lejupielādētu vai saņemtu failus internetā

Atcerieties, ka tīmekļa lapu lasīšana ir ierobežota ar pieejamo paketes daļu. Tātad jums ir jāizmanto funkcija stream_get_contents ( līdzīgi kā file_get_contents) vai kamēr cilpa, lai lasītu saturu mazākos gabalos, līdz tiek sasniegtas faila beigas:

Šajā gadījumā, apstrādājot PHP POST pieprasījumu, pēdējais fread funkcijas arguments ir vienāds ar fragmenta lielumu. Parasti tam nevajadzētu būt lielākam par 8192 ( 8*1024 ).

Ņemiet vērā, ka tas var būt lielāks vai mazāks, un to var ierobežot arī tās sistēmas iestatījumi, kurā darbojas PHP.

Izmantojot failu_get_contents, lai iegūtu vietnes URL

Vēl vienkāršāk ir izmantot šo metodi, lasot failu, izmantojot HTTP, jo jums nav jāuztraucas par lasīšanu pa daļām - viss tiek apstrādāts PHP.

Raksta “Making POST Requests With PHP” tulkojumu sagatavoja draudzīgā projekta komanda




Tops