Jak vypadá žádost o získání. Použití metod GET a POST

V dnešní době se nejčastěji používají pouze dvě metody HTTP: GET a POST. Ukázalo se však, že i mezi těmito dvěma „borovicemi“ se webovým vývojářům daří zabloudit. Existuje pro to vysvětlení: obě metody lze použít k získání stejného výsledku. Musíme si však pamatovat, že bezmyšlenkovité použití kterékoli z metod může vést ke katastrofálním následkům, včetně těžkých nákladů na kanál a bezpečnostních děr.

Abyste tomu zabránili, stačí jednoduše podrobněji porozumět účelu a rozdílům těchto metod.

Pokud se ponoříte do významu názvů metod, mnohé bude jasnější. GET (z angličtiny přijímat), tzn. by měl být použit k dotazování na data. POST (z angl. send by mail) – slouží k odesílání dat na server. Vše se zdá být extrémně jednoduché a jasné. Ale kdo chce vyvíjet weby trochu složitější než vizitkový web s jedním formulářem zpětné vazby, je lepší se s problematikou lépe seznámit.

Zabezpečené a nezabezpečené požadavky HTTP

Specifikace HTTP 1.1 zavádí dva pojmy: zabezpečený a nezabezpečený požadavek, přesněji řečeno, metoda.

Bezpečné metody jsou metody, které mohou vyžadovat pouze informace. Nemohou změnit požadovaný zdroj ani nemohou vést k nežádoucím výsledkům pro uživatele, ostatní nebo server. Příklady bezpečných jsou požadavky na HTML kód webové stránky nebo obrázku. Mezi bezpečné metody patří HEAD a GET.

Poznámka

Ve skutečnosti mohou řemeslníci samozřejmě s požadavky GET ublížit. Například smyčky dotazů.

Nebezpečné dotazy, jak již všichni uhodli, mohou mít potenciálně špatné důsledky, pokud jsou znovu použity. Takové požadavky mohou změnit obsah zdroje, ke kterému se přistupuje. Příklady takových požadavků: zasílání zpráv, registrace, online platby. Mezi nebezpečné metody patří POST, PUT, DELETE.

Idempotentní metody

Idempotence je vlastnost metod, které při četných opakovaných voláních vrátí stejný výsledek, s výjimkou případů, kdy jsou informace zastaralé. To znamená, že při přístupu na stejnou adresu URL se všem uživatelům zobrazí stejná webová stránka, obrázek, video atd. Tuto vlastnost mají metody GET, PUT, DELETE.

Nyní se podívejme blíže na samotné metody GET a POST: udělejme pro každou z nich krátké „shrnutí“.

DOSTAT

  • navržený pro příjem dat ze serveru;
  • tělo požadavku je prázdné;
  • zpracovávány na straně serveru rychleji as menší spotřebou serverových zdrojů díky prázdnému tělu požadavku;
  • přenos proměnných probíhá v adresním řádku (takto to vidí uživatel; technicky se data přenášejí v řádku dotazu) a jsou tedy viditelné informace o proměnných a jejich hodnotách (data nejsou chráněna);
  • je schopen přenést malé množství dat na server: existují omezení na délku URL, která závisí na prohlížeči, například IE6 = 2Kb. Vývojáři Yahoo! doporučují zaměřit se na toto číslo;
  • může přenášet pouze znaky ASCII;
  • takový požadavek lze zkopírovat a uložit (například do záložek);
  • požadavek lze uložit do mezipaměti (to lze ovládat);
  • pro další snížení zatížení kanálu a serveru jsou k dispozici podmíněné a částečné požadavky;
  • nepřeruší připojení HTTP (pokud je na serveru povolen režim keepAlive).

POŠTA

  • určené pro odesílání dat na server;
  • přenos dat probíhá v těle požadavku;
  • zpracování na straně serveru je pomalejší a „těžší“ než GET, protože kromě hlaviček musí být analyzováno i tělo požadavku;
  • schopné přenášet velké množství dat;
  • schopný přenášet soubory;
  • stránku vygenerovanou metodou POST nelze uložit jako záložky;
  • přeruší připojení HTTP;
  • Pro přenos i velmi malého množství informací posílá většina prohlížečů alespoň dva TCP pakety: hlavičku a poté tělo požadavku.

Ukazuje se, že tyto dvě metody nejsou tak podobné. Použití jednoho nebo druhého by mělo být určeno aktuálním úkolem, a ne skutečností, že GET se používá ve výchozím nastavení nebo se s ním snadněji pracuje. GET je samozřejmě ve většině případů lepší varianta, zejména při budování rychlého AJAXu, ale nezapomínejte na jeho nevýhody. Pro sebe jsem si udělal jednoduchý algoritmus-poznámku o výběru metody.

Tento příspěvek je odpovědí na otázku položenou v jednom z mých článků.

V tomto článku vám chci říci, co jsou HTTP metody GET/POST/PUT/DELETE a další, proč byly vynalezeny a jak je používat v souladu s REST.

HTTP

Jaký je tedy jeden z hlavních protokolů internetu? Pedanty pošlu do RFC2616 a zbytek řeknu lidsky :)

Tento protokol popisuje interakci mezi dvěma počítači (klient a server), postavenou na základě zpráv nazývaných požadavek (Request) a odpověď (Response). Každá zpráva se skládá ze tří částí: počátečního řádku, záhlaví a těla. V tomto případě je vyžadována pouze startovní čára.

Počáteční čáry požadavku a odpovědi mají různé formáty – zajímá nás pouze počáteční čára požadavku, která vypadá takto:

URI metody HTTP/ VERZE ,

Kde METHOD je metoda požadavku HTTP, URI je identifikátor zdroje, VERZE je verze protokolu (aktuálně je aktuální verze 1.1).

Záhlaví jsou kolekce párů název-hodnota oddělených dvojtečkou. Hlavičky poskytují různé informace o službě: kódování zprávy, název a verzi prohlížeče, adresu, ze které klient přišel (Referrer) atd.

Tělo zprávy jsou skutečná přenášená data. V odpovědi jsou přenášenými daty zpravidla HTML stránka, kterou prohlížeč požadoval, a v požadavku se například v těle zprávy přenáší obsah souborů nahraných na server. Ale zpravidla v požadavku není vůbec žádné tělo zprávy.

Příklad interakce HTTP

Podívejme se na příklad.

Žádost:
GET /index.php HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Přijmout: text/html Připojení: zavřít
První řádek je řádek dotazu, zbytek jsou záhlaví; tělo zprávy chybí

Odpovědět:
HTTP/1.0 200 OK Server: nginx/0.6.31 Content-Language: ru Content-Type: text/html; charset=utf-8 Content-Length: 1234 Připojení: zavřít ... SAMA STRÁNKA HTML...

Zdroje a metody

Vraťme se na počáteční řádek požadavku a pamatujme, že obsahuje takový parametr, jako je URI. To je zkratka pro Uniform Resource Identifier – jednotný identifikátor zdroje. Zdrojem je zpravidla soubor na serveru (příklad URI je v tomto případě „/styles.css“), ale obecně může být zdrojem také nějaký abstraktní objekt („/blogs/webdev/“ - body na vývoj bloku „Web“ spíše než na konkrétní soubor).

Typ požadavku HTTP (také nazývaný metoda HTTP) říká serveru, jakou akci chceme se zdrojem provést. Zpočátku (začátkem 90. let) se předpokládalo, že klient může od zdroje chtít pouze jednu věc – přijímat jej, ale nyní můžete pomocí protokolu HTTP vytvářet příspěvky, upravovat profil, mazat zprávy a mnoho dalšího. A tyto akce je obtížné kombinovat s pojmem „příjem“.

Pro odlišení akcí od zdrojů na úrovni metod HTTP byly vynalezeny následující možnosti:

  • GET - získání zdroje
  • POST - vytvoření zdroje
  • PUT - aktualizace zdroje
  • DELETE - odstranění zdroje
Upozorňujeme, že specifikace HTTP nevyžaduje, aby server rozuměl všem metodám (kterých je ve skutečnosti mnohem více než 4) - je vyžadován pouze GET a také nesděluje serveru, co má dělat, když obdrží požadavek s konkrétním metoda. To znamená, že server reaguje na požadavek DELETE /index.php HTTP/1.1 není povinen smažte stránku index.php na serveru, stejně jako u požadavku GET /index.php HTTP/1.1 není povinen vrátit vám stránku index.php, může ji například smazat :)

Do hry vstupuje REST

REST (REpresentational State Transfer) je termín zavedený v roce 2000 Royem Fieldingem, jedním z vývojářů protokolu HTTP, jako název skupiny principů pro tvorbu webových aplikací. Obecně REST pokrývá širší oblast než HTTP – lze jej použít i v jiných sítích s jinými protokoly. REST popisuje principy interakce mezi klientem a serverem na základě konceptů „zdroj“ a „sloveso“ (lze chápat jako předmět a predikát). V případě HTTP je zdroj identifikován svým URI a slovesem je metoda HTTP.

REST navrhuje upustit od používání stejného URI pro různé zdroje (tj. adresy dvou různých článků jako /index.php?article_id=10 a /index.php?article_id=20 – toto není cesta REST) ​​a použití různých metod HTTP pro různé akce. To znamená, že webová aplikace napsaná pomocí přístupu REST smaže zdroj při přístupu k němu metodou HTTP DELETE (samozřejmě to neznamená, že je nutné dát možnost smazat vše a všechny, ale žádný požadavek aplikace na odstranění musí používat metodu HTTP DELETE).

REST dává programátorům možnost psát standardizované a o něco hezčí webové aplikace než dříve. Při použití REST nebude URI pro přidání nového uživatele /user.php?action=create (metoda GET/POST), ale jednoduše /user.php (přísně metoda POST).

Výsledkem je, že kombinací stávající specifikace HTTP a přístupu REST dávají různé metody HTTP konečně smysl. GET - vrátí zdroj, POST - vytvoří nový, PUT - aktualizuje existující, DELETE - smaže jej.

problémy?

Ano, s používáním REST v praxi je malý problém. Tento problém se nazývá HTML.

Požadavky PUT/DELETE lze posílat pomocí XMLHttpRequest tím, že ručně kontaktujete server (řekněme přes curl nebo dokonce přes telnet), ale nemůžete vytvořit HTML formulář, který odešle plnohodnotný požadavek PUT/DELETE.

Jde o to, že specifikace HTML vám neumožňuje vytvářet formuláře, které odesílají data jinak než prostřednictvím GET nebo POST. Proto, abyste mohli normálně pracovat s jinými metodami, musíte je uměle napodobit. Například v Racku (mechanismus, na jehož základě Ruby interaguje s webovým serverem; Rails, Merb a další frameworky Ruby jsou vytvořeny pomocí Racku), můžete do formuláře přidat skryté pole s názvem „_method“ a zadejte název metody jako hodnotu (např. "PUT") - v tomto případě bude odeslán požadavek POST, ale Rack bude moci předstírat, že přijal PUT spíše než POST.

Dnes jsem se chtěl trochu ponořit do primitivních věcí a popsat, co se dá na World Wide Web najít ve velkém množství a bez větších potíží. Budeme mluvit prakticky o svatyni protokolu HTTP: požadavcích POST a GET.

Mnozí se budou ptát proč? Odpovím stručně a jasně: ne každý ví, co to je a proč je to potřeba, a kdo se o tom chce dozvědět (a přitom v IT oblasti rozumí málo), často nerozumí tomu, co se píše v mnoha a mnoha článcích věnovaných tomuto téma. Pokusím se prsty vysvětlit, co jsou požadavky POST a GET a k čemu slouží.
Začněme tedy naši cestu do pohádky...
Pokud čtete tuto zprávu, pak alespoň víte, jak vypadá internet a co je to internetová stránka. Po vynechání všech složitostí práce World Wide Web budeme pracovat s pojmy jako uživatel a stránka. Ať už se dá říci cokoli, tyto dvě entity spolu musí nějak interagovat. Lidé spolu například komunikují pomocí gest, emocí a řeči, zvířata vydávají nějaké zvuky, ale co se stane, když člověk a internetový zdroj „komunikují“? Zde máme případ výměny informací, které lze přenést do lidské konverzace typu „otázka-odpověď“. Kromě toho může uživatel i stránka klást otázky a odpovědi. Když mluvíme o webové stránce, její otázky a odpovědi jsou zpravidla vždy vyjádřeny ve formě internetové stránky s tím či oním textem. Pokud jde o uživatele, pak se vše děje díky požadavkům GET a POST (samozřejmě nejen, ale mluvíme o nich).

Zjistili jsme tedy, že naše tematické objekty jsou nezbytné pro „komunikaci“ s weby. Kromě toho lze požadavky GET i POST použít k „kladení otázek“ webu a k „odpovídání“ na ně. Jak jsou odlišní? Všechno je docela jednoduché. Abychom však vysvětlili rozdíly, budeme muset zvážit příklad, pro který si vezmeme stránku plánu internetového obchodu.
Pravděpodobně jste si často všimli, když jste něco hledali v internetových obchodech, že při vyhledávání pomocí filtrů se adresa webu změní z krásné „http://magaazin.ru“ na děsivou „http://magaazin.ru/?category“ = boty&velikost=38". Takže vše, co následuje za symbolem '?', je váš požadavek GET na stránku, a abych byl zcela přesný, v tomto případě se stránky ptáte, co má v kategorii „Obuv“ od velikostí „38“ (tento příklad je převzato z mé hlavy, ve skutečnosti nemusí vše vypadat tak jasně). Výsledkem je, že můžeme klást otázky sami tím, že je označíme v adresním řádku webu. Je zřejmé, že tato metoda má několik nevýhod. Za prvé, kdokoli, kdo je vedle uživatele u počítače, může snadno špehovat všechna data, takže použití tohoto typu požadavku na přenos hesel je vysoce nežádoucí. Za druhé, existuje omezení délky řetězce, který lze přenést z pole adresy webu, což znamená, že nebude možné přenést mnoho dat. Nepochybnou výhodou použití požadavků GET je však snadné použití a schopnost rychle se dotazovat na web, což je užitečné zejména při vývoji, ale to je jiný příběh...
Nyní si promluvme o požadavcích POST. Chytří čtenáři si možná uvědomili, že hlavním rozdílem mezi tímto požadavkem a jeho protějškem je utajení přenášených dat. Pokud vezmeme v úvahu internetový obchod, nápadným příkladem použití požadavku POST je registrace na webu. Stránka vás požádá o údaje, vy tyto údaje vyplníte a kliknutím na tlačítko „Registrace“ odešlete odpověď. Navíc se tato data nebudou nijak externě zobrazovat. Za zmínku také stojí, že lze požadovat poměrně velké množství informací – a požadavek POST nemá žádná omezení. No, pokud sáhnete na mínus, pak takový požadavek nelze vygenerovat rychle. Bez speciálních dovedností to nemůžete udělat. I když ve skutečnosti není všechno tak složité, ale to je zase jiný příběh.
Pojďme si to shrnout. Požadavky POST a GET jsou potřebné pro „komunikaci“ mezi uživatelem a webem. Jsou ve své podstatě téměř opakem. Použití určitých typů dotazů závisí na konkrétní situaci a použití pouze jednoho typu dotazu je krajně nepohodlné.

Tento příspěvek je určen k vysvětlení principů přenosu dat na internetu pomocí dvou hlavních metod: GET a POST. Napsal jsem to jako doplněk k návodu ke generátoru rozvrhu směn pro ty, které pravděpodobně nebudou zajímat podrobnosti ☺.

Přejděte na následující adresu (toto je pro vizuální vysvětlení): http://calendarin.net/calendar.php?year=2016 Věnujte pozornost adresnímu řádku prohlížeče: calendarin.net/calendar.php ?rok=2016 Hlavní soubor je pojmenován, za ním následuje otazník (?) a parametr „rok“ s hodnotou „2016“. Takže vše, co následuje za otazníkem, je požadavek GET. Je to jednoduché. Chcete-li předat více než jeden parametr, musí být odděleny znakem ampersand (&). Příklad: calendarin.net/calendar.php ?year=2016&display=work-days-and-days-off

Hlavní soubor je stále pojmenován, následuje otazník (?), poté parametr „rok“ s hodnotou „2016“, poté ampersand (&), poté parametr „zobrazení“ s hodnotou „pracovní dny- a-dny" -vypnuto".

Parametry GET lze změnit přímo v adresním řádku prohlížeče. Například změnou hodnoty „2016“ na „2017“ a stisknutím klávesy se dostanete do kalendáře pro rok 2017.

Jedná se o skrytý přenos dat (adresa stránky se nemění); to znamená, že můžete vidět pouze to, co bylo přeneseno pomocí programu (skriptu). Například v následujícím nástroji pro počítání znaků v textu jsou původní data přenášena metodou POST: http://usefulonlinetools.com/free/character-counter.php

Pokud máte nějaké dotazy, připomínky a můj e-mail je vám k dispozici.

Kromě metody GET, kterou jsme probrali v předchozím příspěvku, existuje ještě jedna metoda pro odeslání požadavku přes protokol HTTP - metoda POST. V praxi je také velmi často využívána metoda POST.

Pokud jsme pro kontaktování serveru metodou GET stačili zadat požadavek do URL, pak v metodě POST vše funguje na jiném principu.

Abychom mohli tento typ požadavku provést, musíme kliknout na tlačítko s atributem type="submit", které se nachází na webové stránce. Upozorňujeme, že toto tlačítko se nachází v prvku

, který má atribut method nastaven na post.

Zvažte tento HTML kód:

Zadejte text:


Pokud uživatel zadá text do textového pole a klikne na tlačítko „Odeslat“, textová proměnná bude odeslána na server s hodnotou obsahu, který uživatel zadal.

POST a GET požadavky jednoduchými slovy

Tato proměnná bude odeslána pomocí metody POST.

Pokud to napíšete ve tvaru:

Poté budou data odeslána metodou GET.

Pokud v případě požadavku GET bylo množství dat, které jsme mohli přenést, omezeno délkou adresního řádku prohlížeče, pak v případě požadavku POST žádné takové omezení neexistuje a můžeme přenést značné množství informací.

Dalším rozdílem mezi metodou POST a metodou GET je, že metoda POST skrývá všechny proměnné, které předává, a jejich hodnoty ve svém těle (Entity-Body). V případě metody GET byly uloženy v řetězci požadavku (Request-URI).

Zde je příklad požadavku provedeného pomocí metody POST:

POST / HTTP/1.0\r\n
Hostitel: www.site.ru\r\n
Referer: http://www.site.ru/index.html\r\n
Soubor cookie: příjem=1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Obsah-délka: 35\r\n
\r\n
login=Dima&heslo=12345

Při přenosu dat metodou POST bude tedy pro útočníka mnohem obtížnější je zachytit, protože jsou skryty přímému pohledu, proto je metoda POST přenosu dat považována za bezpečnější metodu.

Navíc pomocí metody POST můžete přenášet nejen text, ale i multimediální data (obrázky, zvuk, video). Existuje speciální parametr Content-Type, který určuje typ informací, které je třeba přenést.

A konečně, pro příjem dat, která byla touto metodou přenesena na server, se používá proměnná POST.

Zde je příklad zpracování v PHP:

echo $_POST['text'];
?>

V posledním příspěvku jsme se rozhodli, že prohlížeč (klient) posílá HTTP požadavky na server a server posílá HTTP odpovědi klientovi. Tyto požadavky a odpovědi jsou formátovány podle určitých pravidel. Existuje něco jako syntaxe, jak a v jakém pořadí se má psát. Musí existovat přesně definovaná struktura.

Podívejme se blíže na tuto strukturu, podle které jsou požadavky a odpovědi zabudovány v protokolu HTTP.

Požadavek HTTP se skládá ze tří hlavních částí, které se objevují v níže uvedeném pořadí. Mezi hlavičkami a tělem zprávy je prázdný řádek (jako oddělovač), který představuje znak posunu řádku.

Prázdný řetězec (oddělovač)

Požadavky Post and Get, jaký je mezi nimi rozdíl a který je lepší a pro jaké účely?

tělo zprávy (Entity Body) – volitelný parametr

Řetězec dotazu– určuje metodu přenosu, adresu URL, ke které se má přistupovat, a verzi protokolu HTTP.

Nadpisy– popisuje tělo zpráv, přenáší různé parametry a další informace a informace.

tělo zprávy- toto jsou samotná data, která jsou přenášena v požadavku. Tělo zprávy je volitelný parametr a může chybět.

Když obdržíme požadavek na odpověď ze serveru, tělo zprávy je nejčastěji obsahem webové stránky. Ale při odesílání požadavků na server může být také někdy přítomen, například když na server přenášíme data, která jsme vyplnili ve formuláři zpětné vazby.

Na každý prvek požadavku se podíváme podrobněji v následujících poznámkách.

Vezměme si například jeden skutečný požadavek na server. Každou část požadavku jsem zvýraznil jinou barvou: řádek požadavku je zelený, záhlaví oranžové a tělo zprávy modré.

Požadavek prohlížeče:

Hostitel: webgyry.info

Cookie: wp-settings

Spojení: keep-alive

V následujícím příkladu je již tělo zprávy přítomno.

Odpověď serveru:

Content-Type: text/html; znaková sada=UTF-8

Transfer-Encoding: chunked

Spojení: keep-alive

Keep-Alive: časový limit=5

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

Dokument bez názvu

Jedná se o zprávy vyměňované mezi klientem a serverem prostřednictvím HTTP.

Mimochodem, chcete zjistit, zda má nějaký prvek na vašem webu smysl pomocí „cílů“ Yandex Metrics a Google Analytics?

Odstraňte to, co nefunguje, přidejte to, co funguje, a zdvojnásobte své tržby.

Kurz o nastavení cílů Yandex Metrica..

Kurz o nastavení cílů Google Analytics...

HTTP klient odešle požadavek na server ve formě zprávy požadavku, která má následující formát:

  • Řetězec dotazu (povinný)
  • Nadpis (volitelný prvek)
  • Prázdný řetězec (povinný)
  • Tělo zprávy (volitelný prvek)

Podívejme se na každý z těchto prvků samostatně.

Řetězec dotazu

Řádek požadavku začíná tokenem metody, za nímž následuje identifikátor URI požadavku a verze protokolu. Prvky jsou od sebe odděleny mezerami:

Podívejme se na tento prvek podrobněji.

Metoda požadavku

Tento prvek určuje metodu, která by měla být volána na straně serveru na zadaném URI.

HTTP má osm metod:

  • HLAVA
    Používá se k získání stavu a řetězce záhlaví ze serveru pomocí URI. Nemění data.
  • DOSTAT
    Používá se k příjmu dat ze serveru na zadaném URI. Nemění data.
  • POŠTA
    Používá se k odesílání dat na server (jako jsou informace o vývojáři atd.) pomocí formulářů HTML.
  • DÁT
    Nahradí všechna předchozí data ve zdroji novými načtenými daty.
  • VYMAZAT
    Odstraní všechna aktuální data na prostředku určeném identifikátorem URI.
  • PŘIPOJIT
    Naváže tunelové připojení k serveru na zadaném URI.
  • MOŽNOSTI
    Popisuje vlastnosti připojení pro zadaný prostředek.
  • STOPA
    Poskytuje zprávu obsahující návratovou stopu umístění zdroje zadaného v URI.

URI požadavku

URI (Uniform Resource Identifier) ​​je identifikátor zdroje, na který je požadavek odeslán. Nejběžněji používaný formát URI je následující:

‘*’ používá se, když se požadavek HTTP nevztahuje ke konkrétnímu zdroji, ale k serveru. Používá se pouze v případě, že metodu není třeba aplikovat na zdroj. Například,

absolutníURI používá se při požadavku HTTP na serveru proxy. Proxy je požádán o předání požadavku z dostupné mezipaměti a vrátí odpověď. Například:

absolutní_cesta | zdroj nejčastěji používané.

Naučit se pracovat s požadavky GET a POST

Je požadován konkrétní zdroj na konkrétním serveru. Klient chce například přijímat zdroj ze serveru přes port 80. Adresa zdroje je „www.proselyte.net“ a odesílá následující požadavek:

Dotazování na pole záhlaví

Pole záhlaví umožňují klientovi předat serveru další informace o požadavku ao něm samotném. Tato pole fungují jako modifikátory dotazu.

Níže je uveden seznam nejdůležitějších polí záhlaví, která lze použít:

  • Accept-Charset
  • Accept-Encoding
  • Přijímací jazyk
  • Oprávnění
  • Očekávat
  • If-Match
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • If-Unmodified-Since
  • Rozsah
  • Referrer
  • User-Agent

Pokud chceme implementovat vlastního klienta a vlastní webový server, můžeme si vytvořit vlastní pole záhlaví.

Příklad požadavku HTTP

Tím končí naše studie požadavků HTTP.
V příštím článku se podíváme na HTTP odpovědi.

Jedním ze způsobů, jak odeslat požadavek HTTP na server, je metoda GET. Tato metoda je nejběžnější a nejčastěji se pomocí ní odehrávají požadavky na server.

Nejjednodušší způsob, jak vytvořit požadavek GET, je zadat adresu URL do adresního řádku prohlížeče.

Prohlížeč odešle serveru přibližně následující informace:

GET / HTTP/1.1
Hostitel: webgyry.info
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0
Přijmout: text/html,application/xhtml+xml,application/xml;q=0,9,*/*;q=0,8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: wp-settings
Spojení: keep-alive

Žádost se skládá ze dvou částí:

1. Linka žádostí

2. Záhlaví zpráv

Všimněte si, že požadavek GET nemá tělo zprávy. To ale neznamená, že s jeho pomocí nemůžeme přenášet žádné informace na server.

Rozdíl mezi metodami GET a POST

To lze provést pomocí speciálních parametrů GET.

Chcete-li do požadavku přidat parametry GET, musíte na konec adresy URL přidat „?“. a poté se jich začněte ptát podle následujícího pravidla:

název_parametru1=hodnota_parametru1& název_parametru2=hodnota_parametru2&…

Oddělovač mezi parametry je znak „&“.

Pokud například chceme serveru předat dvě hodnoty, uživatelské jméno a jeho věk, lze to provést pomocí následujícího řádku:

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

Když je tento požadavek proveden, data skončí v tzv. proměnné prostředí QUERY_STRING, ze které je lze na serveru načíst pomocí webového programovacího jazyka na straně serveru.

Zde je příklad toho, jak to lze provést v PHP.

echo "Vaše jméno: " . $_GET["jméno"] . "
»;
echo "Váš věk: " . $_GET["věk"] . "
»;
?>

Konstrukce $_GET[“parameter_name”] umožňuje zobrazit hodnotu předávaného parametru.

V důsledku spuštění tohoto kódu v prohlížeči se zobrazí následující:

Vaše jméno: dima
Váš věk: 27

Také provádíme požadavek na server pomocí metody GET.

První metodou, jak provést požadavek PHP POST, je použít file_get_contents . Druhá metoda bude používat fread v kombinaci s několika dalšími funkcemi. Obě možnosti používají funkci stream_context_create k vyplnění požadovaných polí záhlaví požadavku.

Vysvětlení kódu

Proměnná $sPD obsahuje data, která mají být přenesena. Musí být ve formátu řetězce požadavku HTTP, takže některé speciální znaky musí být zakódovány.

Jak ve funkci file_get_contents, tak ve funkci fread máme dva nové parametry. První z nich je use_include_path . Protože provádíme požadavek HTTP, bude v obou příkladech nepravdivý. Když je nastaveno na true pro čtení místního zdroje, funkce bude hledat soubor na adrese include_path .

Druhým parametrem je kontext, který je vyplněn návratovou hodnotou stream_context_create, která přebírá hodnotu pole $aHTTP.

Použití file_get_contents k vytváření požadavků POST

Chcete-li odeslat požadavek POST pomocí file_get_contents v PHP, musíte použít stream_context_create k ručnímu vyplnění polí záhlaví a určení, který "wrapper" se má použít - v tomto případě HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST data $aHTTP = array("http" => // Wrapper, který bude použit array("method" => "POST", // Metoda požadavku // Hlavičky požadavku jsou nastaveny pod "header" => "Content - typ: application/x-www-form-urlencoded", "content" => $sPD)); $kontext = stream_context_create($aHTTP); $obsah = file_get_contents($sURL, false, $kontext); echo $obsah;

Použití fread k provádění požadavků POST

K vytváření požadavků POST můžete použít funkci fread. Následující příklad používá stream_context_create k sestavení nezbytných záhlaví požadavků HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST data $aHTTP = array("http" => // Wrapper, který bude použit array("method" => "POST", // Metoda požadavku // Hlavičky požadavku jsou nastaveny pod "header" => "Content - typ: application/x-www-form-urlencoded", "content" => $sPD)); $kontext = stream_context_create($aHTTP); $handle = fopen($sURL, "r", false, $kontext); $obsah = ""; while (!feof($handle)) ( $contents .= fread($handle, 8192); ) fclose($handle); echo $obsah;

Vytváření požadavků GET pomocí PHP

Nyní se zaměříme na používání fread a file_get_contents ke stahování obsahu z internetu přes HTTP a HTTPS. Chcete-li použít metody popsané v tomto článku, musíte povolit možnost fopen wrappers. Chcete-li to provést, musíte v souboru php.ini nastavit parametr allow_url_fopen na hodnotu On.

Provádění požadavků POST a GET v PHP se používá k přihlášení na webové stránky, načtení obsahu webových stránek nebo ke kontrole nových verzí aplikací. Probereme, jak vytvářet jednoduché požadavky HTTP.

Používání fread ke stahování nebo přijímání souborů přes internet

Pamatujte, že čtení webové stránky je omezeno na přístupnou část paketu. Musíte tedy použít funkci stream_get_contents ( podobně jako file_get_contents) nebo while cyklus pro čtení obsahu po menších kouscích, dokud není dosaženo konce souboru:

V tomto případě zpracování požadavku PHP POST je poslední argument funkce fread roven velikosti fragmentu. Obecně by nemělo být větší než 8192 ( 8*1024 ).

Mějte na paměti, že může být větší nebo menší a také může být omezena nastavením systému, na kterém PHP běží.

Pomocí file_get_contents získáte adresu URL webu

Ještě jednodušší je použít tuto metodu při čtení souboru přes HTTP, protože se nemusíte starat o čtení po kouscích - vše je řešeno v PHP.

Překlad článku „Making POST Requests With PHP“ připravil přátelský projektový tým




Horní