Uy / Turli xil / http da get qanday ishlaydi. So'rovlarni yuborish va olish, ularning orasidagi farq nima va qaysi biri yaxshiroq va qanday maqsadlarda? HTTP protokoli. Kirish

http da get qanday ishlaydi. So'rovlarni yuborish va olish, ularning orasidagi farq nima va qaysi biri yaxshiroq va qanday maqsadlarda? HTTP protokoli. Kirish

Ushbu va keyingi bo'limlar PHP yordamida asosiy veb-ilovalarni qanday yaratishni qisqacha yoritadi. Bo'limda muhokama qilingan narsa sizning ilovangiz foydalanuvchi bilan bog'lanishi va u bajargan harakatlariga yoki u kiritgan parametrlarga qarab shakllantirishi uchun etarli emas. Nima etishmayapti? Foydalanuvchi ma'lumotlarini kiritish va ushbu ma'lumotlarni serverga o'tkazishni tashkil etish bo'yicha etarli bilim yo'q. Xo'sh, siz allaqachon serverda olingan ma'lumotlarni dasturiy ravishda qayta ishlash haqida asosiy bilimlarga ega bo'lishingiz kerak.

HTTP so'rov usullari va ularning parametrlari

Har qanday dinamik veb-ilova foydalanuvchi tomonidan kiritilgan parametrlarga yoki mijoz tomonidan bajarilgan harakatlarga muvofiq javob beradi. Server bilan bog'lanish ko'pincha ikki turdagi so'rovlarga to'g'ri keladi: GET usuli yoki POST usulidan foydalanish. Ushbu ikki turdagi so'rovlar o'rtasidagi farqlar haqida bir necha so'z.

GET usuli:

    Parametrlar HTTP so'rovi sarlavhasida yuboriladi, shuning uchun ular ko'rinadi buyruq qatori, va bunday so'rov xatcho'plarda saqlanishi mumkin. Sarlavhaning umumiy uzunligi cheklanganligi sababli, GET yordamida uzatiladigan parametrlar soni va uzunligi ham cheklangan.

    Ketma-ket bajarilgan bir nechta bir xil GET so'rovlarining natijalari bir xil bo'lishi kerak deb ishoniladi.

POST usuli:

    So'rov parametrlari HTTP so'rovining asosiy qismida uzatiladi, shuning uchun ular buyruq satrida mavjud emas. Parametrlarning soni va hajmi cheklanmagan.

    Bir nechta bir xil POST so'rovlarining natijalari turli qiymatlarni qaytarishi mumkin, chunki ular maqsadli ob'ekt xususiyatlarini o'zgartirishi mumkin.

GET usulidan maqsadli resursning ma'lumotlar tuzilmalariga o'zgartirishlar kiritishning hojati bo'lmaganda parametrlar bo'yicha axborot resursi tarkibini olish uchun foydalanish kerak va so'rovni (URL) xatcho'plarda saqlash mantiqiy. GET usuli POST usuli yordamida o'xshash so'rovlarga qaraganda tezroq ishlashi mumkin.

POST usulidan serverga uzatilgan parametrlarni URL manzilidan yashirish kerak bo'lganda foydalanish kerak. Ushbu usul, shuningdek, parametrlarda (so'rovning tanasida) ushbu o'zgarishlarning tavsifini o'tkazib, maqsadli resurs tarkibiga o'zgartirish kiritish so'rovlarida ham qo'llanilishi kerak.

Resursga yoʻl?parameter1=value1¶meter2=value2&…

Agar sizda parametrlarni to'ldirish uchun maxsus HTML formangiz bo'lmasa, test parametrlarini to'g'ridan-to'g'ri brauzer buyruq satriga o'tkazish orqali PHP ilovangizni disk raskadrovka qilishingiz mumkin, masalan:

Http://site/php-samples/sql.php?sql=select * from d_staff

Server tomonidagi so'rov parametrlariga kirish uchun siz global massivlardan foydalanishingiz kerak $_GET Va $_POST mos ravishda. Agar ilovangiz qaysi usul bilan kirishiga ahamiyat bermasa, siz massivdan foydalanishingiz kerak $_REQUEST, bu $_GET va $_POST massivlarining ma'lumotlarini birlashtiradi, masalan, quyidagicha:

$sql = isset($_REQUEST["sql"]) ? $_REQUEST["sql"] : "";

Ushbu misolda dastur "sql" parametri o'tkazilganligini aniqlaydi: agar shunday bo'lsa, u o'z qiymatini mos keladigan o'zgaruvchiga beradi, agar bo'lmasa, unga bo'sh qiymat beradi.

HTML formasi orqali HTTP so'rov parametrlarini aniqlash

Albatta, parametrlarni to'g'ridan-to'g'ri brauzer buyruq qatorida qo'lda aniqlash juda qulay emas. Ushbu usul veb-ilovalar bir-biri bilan aloqa qilganda HTTP so'rovlarini dasturiy ravishda bajarish uchun javob beradi. Mijoz tomonidan dastlabki ma'lumotlarni tekshirishni kiritish va amalga oshirish uchun siz HTML shakllari va . Quyida misol keltirilgan eng oddiy shakl, uning yordamida matn parametri (qiymati) kiritiladi, u keyinchalik POST usuli parametri sifatida serverga uzatiladi.

usuli "post" harakat =’sql.php’ > SQL:

Shakl elementining metod atributi ma'lumotlarni serverga (olish yoki post) uzatish usulini belgilaydigan usulni belgilaydi. Harakat atributi belgilaydi php fayli , bu so'rovni qayta ishlaydi. Agar ishlov beruvchi joriy fayl bo'lishi kerak bo'lsa, unda action atributini qo'shish shart emas. Qiymati HTTP so'rovi parametri sifatida o'tkazilishi kerak bo'lgan barcha elementlar uchun nom atributi uchun noyob qiymatni belgilashingiz kerak. Bu atribut qiymati nomi bo'ladi indeks$_GET, $_POST yoki $_REQUEST massivlarida (yuqoridagi misolga qarang). Bir tugmani bosish topshirish barcha kiritilgan qiymatlar bilan formani serverga yuboradi.

PHP POST so'rovini bajarishning birinchi usuli file_get_contents dan foydalanishdir. Ikkinchi usulda fread bir nechta boshqa funktsiyalar bilan birgalikda ishlatiladi. Har ikkala variant ham kerakli so‘rov sarlavhasi maydonlarini to‘ldirish uchun stream_context_create funksiyasidan foydalanadi.

Kod tushuntirish

$sPD o'zgaruvchisi uzatiladigan ma'lumotlarni o'z ichiga oladi. U HTTP so'rovi satri formatida bo'lishi kerak, shuning uchun ba'zi maxsus belgilar kodlangan bo'lishi kerak.

file_get_contents funksiyasida ham, fread funksiyasida ham ikkita yangi parametr mavjud. Birinchisi use_include_path . Biz HTTP so'rovini yuborayotganimiz sababli, u ikkala misolda ham noto'g'ri bo'ladi. Mahalliy resursni o‘qish uchun “true” qiymati o‘rnatilsa, funktsiya include_path manzilidagi faylni qidiradi.

Ikkinchi parametr kontekst bo'lib, u $aHTTP massivining qiymatini oladigan stream_context_create qaytaruvchi qiymati bilan to'ldirilgan.

POST so'rovlarini bajarish uchun file_get_contents dan foydalanish

PHP da file_get_contents yordamida POST soʻrovini yuborish uchun siz sarlavha maydonlarini qoʻlda toʻldirish uchun stream_context_create dan foydalanishingiz va qaysi “oʻram”dan foydalanishni belgilashingiz kerak. Ushbu holatda HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST ma'lumotlari $aHTTP = array("http" => // Foydalanadigan sarlavha array("method" => "POST", // So'rov usuli // So'rov sarlavhalari "sarlavha" ostida o'rnatilgan => "Kontent - turi: application/x-www-form-urlencoded", "content" => $sPD)); $kontekst = stream_context_create($aHTTP); $contents = file_get_contents($sURL, noto'g'ri, $kontekst); echo $contents;

POST so'rovlarini bajarish uchun freaddan foydalanish

POST so'rovlarini bajarish uchun fread funktsiyasidan foydalanishingiz mumkin. Quyidagi misol kerakli HTTP so'rov sarlavhalarini yaratish uchun stream_context_create dan foydalanadi:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST ma'lumotlari $aHTTP = array("http" => // Foydalaniladigan o'rash array("method" => "POST", // So'rov usuli // So'rov sarlavhalari "sarlavha" ostida o'rnatilgan => "Kontent - turi: application/x-www-form-urlencoded", "content" => $sPD)); $kontekst = stream_context_create($aHTTP); $handle = fopen($sURL, "r", noto'g'ri, $kontekst); $contents = ""; while (!feof($handle)) ( $contents .= fread($handle, 8192); ) fclose($handle); echo $contents;

PHP bilan GET so'rovlarini amalga oshirish

Endi biz HTTP va HTTPS orqali internetdan tarkibni yuklab olish uchun fread va file_get_contents dan foydalanishga e'tibor qaratamiz. Ushbu maqolada tasvirlangan usullardan foydalanish uchun fopen wrappers opsiyasini yoqishingiz kerak. Buning uchun php.ini faylida allow_url_fopen parametrini On ga o'rnatishingiz kerak.

PHP-da POST va GET so'rovlarini bajarish veb-saytlarga kirish, veb-sahifa tarkibini olish yoki ilovalarning yangi versiyalarini tekshirish uchun ishlatiladi. Biz oddiy HTTP so'rovlarini qanday qilishni ko'rib chiqamiz.

Internet orqali fayllarni yuklab olish yoki qabul qilish uchun fread-dan foydalanish

Veb-sahifani o'qish paketning kirish mumkin bo'lgan qismi bilan cheklanganligini unutmang. Shuning uchun siz stream_get_contents funktsiyasidan foydalanishingiz kerak ( file_get_contents ga o'xshash) yoki fayl oxiriga yetguncha tarkibni kichikroq bo'laklarga bo'lib o'qish uchun bir muddat tsikli:

PHP POST so'rovini qayta ishlashda fread funksiyasining oxirgi argumenti fragment hajmiga teng bo'ladi. Odatda 8192 dan oshmasligi kerak ( 8*1024 ).

Ularning umumiy tomoni shundaki, ular bir xil ishlaydi. Texnik jihatdan ular o'rtasida hech qanday farq yo'q. Ammo mafkuraviy tafovutlar mavjud.

Men ular haqida PHP kontekstida gapirib beraman. Shuni esda tutingki, HTTP protokoli bilvosita PHP bilan bog'liq, chunki u HTML sahifalarini almashish uchun yaratilgan va PHP ikkalasining imkoniyatlarini kengaytiradi.

GET so'rovi ma'lumotlarni qabul qilish uchun, POST esa yuborish uchun ishlatiladi. (Texnik jihatdan ular bir xil ishlashini unutmang).

Shuning uchun, PHP kontekstida ushbu mafkuraga asoslanib, biz quyidagilarni amalga oshirdik:
1. Har safar PHP ni ishga tushirganingizda sukut bo'yicha superglobal massivlar ($_GET, $_POST) yaratiladi.
2. So‘rovlar qatorida so‘roq belgisi(?) bo‘lsa. Undan keyin hamma narsa ko'rib chiqiladi parametrlari GET so'rovi, ular "kalit" = "qiymat" formatida taqdim etiladi va ajratuvchi sifatida ampersand belgisi (&) ishlatiladi.
Misol:
GET /index.php?name=Andrey&familiya=Galkin
Bu so'rovlar qatori, 2 ta parametr mavjud. bu parametrlar $_GET massiviga kiradi.
3. $_POST boshqa usulda to'ldiriladi. ushbu massivning mazmuni "so'rov sarlavhalari" dan to'ldiriladi. Ya'ni, ko'zdan aniq yashiringan joydan. Brauzer bunday sarlavhalarni yaratishning barcha ishlarini bajaradi. Ba'zida sarlavhalarda biror narsa qo'lda tahrirlangan bo'lsa-da.

Ko'pincha, post so'rovi shakllarda (ma'lumotlarni yuborish uchun) ishlatiladi.

Misol uchun, bizda 2 ta maydondan iborat kirish formasi mavjud: login va parol.

Tasavvur qilaylik, biz GET usulidan foydalanamiz. Keyin, shaklni yuborayotganda, biz quyidagi manzilga o'tamiz /login.php?login=Andrey&password=123 Bunday ma'lumotni bu tarzda uzatish umuman xavfsiz emasligiga rozi bo'lasiz. Har kim sizning brauzeringizni ochishi mumkin va sayt manzilini kiritishdan boshlab, ular tarixdan parollaringiz va loginlaringizni ko'rishlari mumkin.

Ammo POST usulini belgilagan bo'lsak, biz quyidagi so'rovni qabul qilamiz:
POST /login.php (login=Andrey&password=123) qavs ichidagilar yashirin bo'ladi va brauzerda hech qanday tarzda saqlanmaydi.

Xulosa qilish uchun:
GET - ma'lum bir sahifaga kirish ma'lum bir shakl(saralash, joriy sahifa blog, qidiruv paneli va boshqalar).
POST - sahifaning ko'rinishiga ta'sir qilmaydigan ma'lumotlarni yuborish uchun, bu ma'lumotlar faqat skript natijasiga ta'sir qiladi (loginlar, parollar, kredit karta raqamlari, xabarlar va boshqalar).

Va yana bir yaxshi yangilik, masalan, ular birlashtirilishi mumkin
POST /index.php?page=login (login=Andrey&password=123) Oʻylaymanki, bundan nima kelib chiqishi va qaysi parametrlar qaysi massivga kirishi haqida yetarlicha tushuntirdim.

IN yaqinda Men PHPClub asosiy forumida POST va GET so'rovlarini yaratish mavzusiga oid savollarni, shuningdek, "Sarlavha funktsiyasidan foydalanib qanday qilib POST so'rovini yaratishim mumkin" mavzusiga oid savollarni tobora ko'proq ko'rmoqdaman. Foydalanishda "i" ni nuqta qo'yish zarurligiga ishonaman bu texnologiya, chunki Ajam dasturchilar shunchaki Internet tamoyillarini tushunmaydilar. Shunday qilib, HTTP protokoli dunyosi bo'ylab sayohatimizni boshlaylik.

1. HTTP protokoli. Kirish

Men darhol bir kichik narsani aniqlab bermoqchiman.

Dahshatli so'z protokoli ko'p odamlarning kelishuvidan boshqa narsa emas, bir vaqtning o'zida odamlar: "Keling, shunday qilaylik, shunda hammasi yaxshi bo'ladi" degan qarorga kelishdi. Qo'rqadigan hech narsa yo'q, hamma narsa juda g'alati va biz endi bu sharmandalikni ochib beramiz. Shunday qilib, HTTP protokoli nima va u nima uchun ishlatiladi?

Dunyoda hech qanday mo''jiza yo'q, ayniqsa dasturlash va Internet olamida!

Buni buzilmas haqiqat sifatida qabul qiling. Va agar dastur ishlamasa yoki kerakli darajada ishlamasa, unda, ehtimol, u noto'g'ri yozilgan yoki xatolar mavjud. Xo'sh, qanday qilib brauzer serverdan biror narsa yuborishni so'raydi?

Ha, juda oddiy! Siz ozgina dam olishingiz va jarayondan zavqlanishni boshlashingiz kerak :-)

1.2. Birinchi HTTP so'rovimizni yozish

  • Agar siz hamma narsani juda murakkab deb hisoblasangiz, adashasiz. Inson shunday yaratilganki, u oddiygina murakkab narsani yaratishga qodir emas, aks holda uning o'zi unda adashib qoladi :-) Demak, brauzer bor va veb-server mavjud.
  • Brauzer har doim ma'lumotlar almashinuvining tashabbuskori hisoblanadi. Veb-server hech qachon hech kimga shunchaki hech narsa yubormaydi, shunda u brauzerga biror narsa yuboradi - brauzer buni so'rashi kerak.
  • Eng oddiy HTTP so'rovi quyidagicha ko'rinishi mumkin:
  • http://www.php.net/ HTTP/1.0\r\n\r\n
GET (ingliz tilidan tarjimasi "olish" degan ma'noni anglatadi) - so'rov turi har xil bo'lishi mumkin, masalan, POST, HEAD, PUT, DELETE (biz ulardan ba'zilarini quyida ko'rib chiqamiz). http://www.php.net/ - biz hech bo'lmaganda ma'lumot olishni xohlaydigan URI (manzil) (tabiiyki, HTML sahifasini o'rganishga umid qilamiz). HTTP/1.0 protokol turi va versiyasi bo'lib, biz server bilan muloqot qilishda foydalanamiz.

\r\n - bu ikki marta takrorlanishi kerak bo'lgan chiziqning oxiri, nima uchun birozdan keyin aniq bo'ladi;

Ushbu so'rovni juda oddiy bajarishingiz mumkin. Telnet.exe dasturini ishga tushiring, www.php.net ni xost sifatida kiriting, 80-portni belgilang va Enter tugmasini ikki marta \r\n\r\n bosish orqali ushbu so'rovni kiriting. Bunga javoban siz HTML kodini olasiz

bosh sahifa www.php.net sayti.

  • 1.3 So'rov tuzilishi Keling, HTTP so'rovi nimadan iboratligini ko'rib chiqaylik.
  • Hammasi juda oddiy. HTTP so'rovi to'liq mazmunli matn ekanligidan boshlaylik. Umumiy holatda u nimadan iborat? Biz HTTP 1.0 protokolini ko'rib chiqamiz. Shunday qilib:

  • So'rov liniyasi[Umumiy sarlavha | So'rov sarlavhasi | Entity-header ]\r\n[ Entity-Body ]
  • So'rov liniyasi- parametrlar to'plamiga ega sahifaga nisbatan yoki mutlaq havola, masalan, /index.html yoki http://www.myhost.ru/index.html yoki /index.html?a=1&b=qq.
  • Ikkinchi holda, serverga tegishli qiymatlarga ega a va b o'zgaruvchilar to'plami bilan so'rov yuboriladi va "&" belgisi - ampersand - parametrlar orasidagi ajratuvchi bo'lib xizmat qiladi. HTTP-versiyasi

- HTTP protokolining versiyasi, bizning holatlarimizda "HTTP/1.0".

Bizni GET va POST ishlov berish usullari juda qiziqtiradi. GET usuli yordamida siz oddiygina parametrlarni skriptga o'tkazishingiz mumkin va POST usuli bilan siz shaklni yuborishga taqlid qilishingiz mumkin. GET usuli uchun Request-URI quyidagicha ko'rinishi mumkin:

  • "/index.html?param1=1¶m2=2". Umumiy - sarlavha
    - sarlavhaning asosiy qismi.
    Format:
  • Faqat ikkita parametrga ega bo'lishi mumkin: Sana yoki Pragma. Sana - Grinvich sanasi formatida "Hafta kuni, Kun Oy Yil HH:MM:SS GMT", masalan, "Sesshanba, 15 noyabr 1994 yil 08:12:31 GMT" - so'rov yaratilgan sana. Pragma bitta keshsiz qiymatga ega bo'lishi mumkin, bu esa sahifani keshlashni o'chiradi.

    So'rov - sarlavha - so'rovni tavsiflovchi sarlavha qismi..
    Request-Header quyidagi parametrlarga ega bo'lishi mumkin:

  • Ruxsat berish, Avtorizatsiya, Kimdan, O'zgartirilgan bo'lsa, Referer, Foydalanuvchi-Agent Ushbu bobda biz Avtorizatsiya parametrini ko'rib chiqmaymiz, chunki u shaxsiy resurslarga kirish uchun ishlatiladi, bu juda tez-tez kerak emas.
    Ruxsat etilgan kirish sarlavhasini qanday yaratishni o'zingiz www.w3c.org saytida o'rganishingiz mumkin.
    Ruxsat bering
  • - qayta ishlashning maqbul usullarini belgilaydi. - Format: "Ruxsat berish: GET | HEAD\n". Request-Line-da POST ishlov berish usulini belgilashda parametr e'tiborga olinmaydi. Qabul qilinadigan so'rovni qayta ishlash usullarini belgilaydi.
    Proksi-serverlar ruxsat berish parametrini o'zgartirmaydi va u serverga o'zgarmagan holda etib boradi.
    Kimdan E-pochta manzili so'rovni kim yuborgan.
  • Format: "Kimdan: adderss\r\n". Masalan, "Kimdan:
    [elektron pochta himoyalangan]
    \r\n".
  • Agar o'zgartirilgan bo'lsa- so'rov falon vaqtdan beri o'zgartirilmaganligini bildiradi.
    Format: "Agar o'zgartirilgan bo'lsa: sana\r\n"
    Faqat GET ishlov berish usuli uchun foydalaniladi. Sana GMT da Umumiy sarlavhadagi Sana parametri bilan bir xil formatda ko'rsatilgan.
  • Yo'naltiruvchi- so'rov boshlangan sahifaga mutlaq havola, ya'ni foydalanuvchi biznikiga kirgan sahifaga havola.
    Format: "Referer: url\n".
  • Misol: "Referrer: www.host.ru/index.html\n". Foydalanuvchi-Agent
    So'rovning ushbu qismi sahifaning asosiy qismini tavsiflovchi parametrlarni belgilaydi. Entity-Header quyidagi parametrlarni o'z ichiga olishi mumkin: Ruxsat berish, kontentni kodlash, kontent uzunligi, kontent turi, muddati, oxirgi o‘zgartirilgan, kengaytma sarlavhasi.
  • Ruxsat berish, Avtorizatsiya, Kimdan, O'zgartirilgan bo'lsa, Referer, Foydalanuvchi-Agent- Umumiy sarlavhadan ruxsat berish parametriga o'xshash parametr.
  • Kontentni kodlash- ma'lumotlarni kodlash turi Entity-Body.
    Format: "Kontent-kodlash: x-gzip | x-kompres | boshqa turdagi\n".
    Misol: "Kontent-kodlash: x-gzip\n". "|" belgisi “yoki” so‘zini anglatadi, ya’ni u yoki bu yoki u va hokazo.
    Boshqa turdagi ma'lumotlar qanday kodlanganligini ko'rsatishi mumkin, masalan, POST usuli uchun: "Content-Encoding: application/x-www-form-urlencoded\n".
  • Tarkib uzunligi- Subyektga yuborilgan baytlar soni. Content-Length qiymati MIME formatida yuborilgan ma'lumotlar uchun butunlay boshqacha ma'noga ega bo'lib, u ma'lumotlarning bir qismini tavsiflash uchun parametr sifatida ishlaydi - "tashqi/ob'ekt-tana".
    Yaroqli raqamlar noldan va undan yuqori bo'lgan butun sonlardir.
  • Misol: "Tarkib uzunligi: 26457\n". Kontent turi
    - uzatiladigan ma'lumotlar turi.
  • Masalan: "Content-Type: text/html\n". Muddati tugaydi
    - Sahifani brauzer keshidan olib tashlash kerak bo'lgan vaqt.
  • Format: “Muddati tugaydi: sana\n”. Sana formati Umumiy sarlavhadagi Sana parametri uchun sana formati bilan bir xil. Oxirgi tahrirlangan
    - uzatilgan ma'lumotlarning oxirgi o'zgarishi vaqti.
  • Format: "Oxirgi tahrirlangan: sana\n". Sana formati Umumiy sarlavhadagi Sana parametri uchun sana formati bilan bir xil. kengaytma-sarlavha
    - masalan, hujjatni qabul qiluvchi brauzer yoki boshqa dastur tomonidan qayta ishlash uchun mo'ljallangan bo'lishi mumkin bo'lgan sarlavhaning bir qismi. Ushbu qismda siz parametrlaringizni "ParameterName: parametr qiymati\n" formatida tasvirlashingiz mumkin. Agar mijoz dasturi ularni qanday qayta ishlashni bilmasa, ushbu parametrlar e'tiborga olinmaydi.

Masalan: "Cookie: r=1\r\n" - sahifa uchun taniqli cookie-fayllarni o'rnatadi.

Va endi, bunday dahshatli so'zlardan keyin, keling, bir oz tinchlanishga harakat qilaylik va bizga nima kerakligini tushunaylik? Tabiiyki, biz misollar bilan tushunamiz.

Tasavvur qilaylik, biz Cookie-fayllarni o'tkazish orqali saytdan sahifa olishimiz kerak, aks holda biz shunchaki chaqirilmagan mehmonlar sifatida yuborilamiz va bundan tashqari, ma'lumki, siz ushbu sahifaga faqat asosiy sahifaga kirganingizdan so'ng kirishga ruxsat beriladi. sayt.

2 GET usuli

Keling, iltimosimizni yozamiz.
http://www.site.ru/news.html HTTP/1.0\r\n

Xost: www.site.ru\r\n
Cookie: daromad=1\r\n

Ushbu so'rov bizga GET usuli yordamida http://www.site.ru/news.html sahifasi mazmunini olishni xohlayotganimizni bildiradi. Xost maydoni ushbu sahifa www.site.ru serverida joylashganligini bildiradi, Referer maydoni biz saytning asosiy sahifasidan yangiliklar uchun kelganimizni, Cookie maydoni esa bizga falon cookie fayli tayinlanganligini bildiradi. Xost, Referer va Cookie maydonlari nima uchun juda muhim? Chunki oddiy dasturchilar dinamik saytlarni yaratishda skriptlarda (jumladan, PHPda) oʻzgaruvchilar koʻrinishida paydo boʻladigan maʼlumotlar maydonlarini tekshiradilar. Bu nima uchun? Masalan, saytni talon-taroj qilishning oldini olish uchun, ya'ni.

ular avtomatik yuklab olish uchun dasturni o'rnatmaganlar yoki saytga tashrif buyurgan odam har doim unga faqat asosiy sahifadan kirishi uchun va hokazo.

Keling, sahifadagi forma maydonlarini to'ldirishimiz va formadan so'rov yuborishimiz kerakligini tasavvur qilaylik, bu shaklda ikkita maydon bo'lsin: login va parol (login va parol) - va, albatta, biz loginni bilamiz. va parol.
http://www.site.ru/news.html HTTP/1.0\r\n
OLISH http://www.site.ru/news.html?login=Petya%20Vasechkin&password=qq HTTP/1.0\r\n
Xost: www.site.ru\r\n
Cookie: daromad=1\r\n

Yo'naltiruvchi: http://www.site.ru/index.html\r\n Bizning loginimiz "Petya Vasechkin" Nima uchun Petya%20Vasechkin yozishimiz kerak? Buning sababi shundaki, maxsus belgilar server tomonidan yangi parametr mavjudligi yoki so'rovning tugashi va hokazo belgilari sifatida tan olinishi mumkin. Shuning uchun, so'rovda xatolik holatlariga yo'l qo'ymaslik uchun parametr nomlari va ularning qiymatlarini kodlash algoritmi mavjud. To'liq tavsif

bu algoritmni topish mumkin va PHP da kodlash va dekodlash uchun mos ravishda rawurlencode va rawurldecode funksiyalari mavjud. Shuni ta'kidlashni istardimki, agar so'rovda kodlangan parametrlar uzatilgan bo'lsa, PHP dekodlashni o'zi bajaradi. Bu HTTP protokoli bilan tanishishimning birinchi bobini yakunlaydi. Keyingi bobda biz POST (ingliz tilidan “yuborish” deb tarjima qilingan) kabi qurilish so‘rovlarini ko‘rib chiqamiz, bu esa ancha qiziqroq bo‘ladi, chunki Bu HTML shakllaridan ma'lumotlarni jo'natishda foydalaniladigan so'rov turi.

3. POST usuli.

3.1 Kontent turi: dastur/x-www-form-urlencoded.

Biz oldingi bobda muhokama qilingan login va parolni o'tkazish uchun GET so'rovimizga o'xshash so'rov yozamiz:


http://www.site.ru/news.html HTTP/1.0\r\n
OLISH http://www.site.ru/news.html?login=Petya%20Vasechkin&password=qq HTTP/1.0\r\n
Xost: www.site.ru\r\n
Kontent turi: application/x-www-form-urlencoded\r\n
Tarkib uzunligi: 35\r\n
Cookie: daromad=1\r\n

Bu erda biz Content-Type va Content-Length sarlavha maydonlaridan foydalanish misolini ko'ramiz. Content-Length sarlavhadan boshqa qator uzilishi bilan ajratilgan ma'lumotlar maydoni qancha baytni egallashini bildiradi \r\n. Ammo ilgari GET so'rovi uchun Request-URI-ga joylashtirilgan parametrlar endi Entity-Body-da. Ko'rinib turibdiki, ular bir xil shaklda tuzilgan, siz ularni faqat sarlavhadan keyin yozishingiz kerak. Yana bir narsani ta'kidlamoqchiman muhim nuqta

, hech narsa So'rov-URI-ga boshqa nomlar bilan parametrlarni joylashtirishga bir vaqtning o'zida Entity-Body-dagi parametrlar to'plami bilan to'sqinlik qilmaydi, masalan:
.....
Cookie: daromad=1\r\n
POST http://www.site.ru/news.html?type=user HTTP/1.0\r\n

login=Petya%20Vasechkin&password=qq

3.2 Kontent turi: ko'p qismli/shakl-ma'lumotlar

Internet olami fayllarni formalar orqali jo'natish yaxshi bo'lishini anglagan zahoti, W3C konsorsiumi POST so'rovi formatini yaxshilashga kirishdi. O'sha vaqtga kelib, MIME formati (Ko'p maqsadli Internet pochta kengaytmalari - pochta xabarlarini yaratish uchun ko'p maqsadli protokol kengaytmalari) allaqachon keng qo'llanilgan edi, shuning uchun g'ildirakni qayta ixtiro qilmaslik uchun biz ushbu xabar yaratish formatining bir qismini yaratish uchun foydalanishga qaror qildik. HTTP protokolidagi POST so'rovlari.

Ushbu format va ilova/x-www-form-urlencoded turi o'rtasidagi asosiy farqlar nimada?

Asosiy farq shundaki, Entity-Body endi chegaralar (chegara) bilan ajratilgan bo'limlarga bo'linishi mumkin. Eng qizig'i shundaki, har bir bo'limda saqlangan ma'lumotlarni tavsiflash uchun o'z sarlavhasi bo'lishi mumkin, ya'ni.

bitta so'rovda siz har xil turdagi ma'lumotlarni uzatishingiz mumkin (pochta xatida bo'lgani kabi, fayllarni matn bilan bir vaqtda uzatishingiz mumkin).
http://www.site.ru/news.html HTTP/1.0\r\n
OLISH http://www.site.ru/news.html?login=Petya%20Vasechkin&password=qq HTTP/1.0\r\n
Xost: www.site.ru\r\n

Shunday qilib, keling, boshlaylik. Keling, login va parolni uzatish bilan bir xil misolni yana ko'rib chiqaylik, ammo endi yangi formatda.
Cookie: daromad=1\r\n
POST http://www.site.ru/news.html HTTP/1.0\r\n Tarkib uzunligi: 209\r\n
--1BEF0A57BE110FD467A Tarkib uzunligi: 209\r\n
Tarkib uzunligi: 209\r\n
\r\n Tarkib uzunligi: 209\r\n
POST http://www.site.ru/news.html HTTP/1.0\r\n Tarkib uzunligi: 209\r\n
Kontent-Dispozitsiya: shakl-ma'lumotlar; name="login" Tarkib uzunligi: 209\r\n
Tarkib uzunligi: 209\r\n
Petya Vasechkin Tarkib uzunligi: 209\r\n
Kontent-Dispozitsiya: shakl-ma'lumotlar; name = "parol" Tarkib uzunligi: 209\r\n

Endi nima yozilganligini tushunamiz. :-) Men ba'zi \r\n belgilarni ma'lumotlar bilan birlashmasligi uchun qalin qilib ajratib ko'rsatdim. Agar diqqat bilan qarasangiz, Content-Type-dan keyin chegara maydonini ko'rasiz. Bu maydon bo'lim ajratuvchi - chegarani belgilaydi. Chegara sifatida lotin harflari va raqamlaridan, shuningdek, ba'zi boshqa belgilardan (afsuski, qaysi biri esimda yo'q) iborat qatordan foydalanish mumkin. So'rovning asosiy qismida chegara boshiga "--" qo'shiladi va so'rov oxiriga "--" belgilari ham qo'shiladigan chegara bilan tugaydi. Bizning so'rovimiz ikkita bo'limdan iborat bo'lib, birinchisida login maydoni, ikkinchisida parol maydoni tasvirlangan.

Content-Disposition (bo'limdagi ma'lumotlar turi) bu shakldagi ma'lumotlar bo'lishini aytadi va nom maydoni maydon nomini belgilaydi. Bu erda bo'lim sarlavhasi tugaydi va undan keyin maydon qiymati joylashtirilgan bo'lim ma'lumotlar maydoni (qiymatni kodlash kerak emas!).

Sizning e'tiboringizni bo'lim sarlavhalarida Content-Length dan foydalanish shart emasligiga qaratmoqchiman, lekin so'rov sarlavhasida siz kerak va uning qiymati ikkinchi \ dan keyin paydo bo'ladigan butun Entity-Body hajmi bo'lishi kerak. r\n quyidagi Kontent uzunligi: 209\ r\n. Bular. Entity-Body sarlavhadan qo'shimcha qator uzilishi bilan ajratilgan (buni bo'limlarda ham ko'rish mumkin).

Endi faylni uzatish uchun so'rov yozamiz.
http://www.site.ru/news.html HTTP/1.0\r\n
POST http://www.site.ru/postnews.html HTTP/1.0\r\n
Xost: www.site.ru\r\n
Yo'naltiruvchi: http://www.site.ru/news.html\r\n
Kontent turi: ko'p qismli/shakl-ma'lumotlar; chegara=1BEF0A57BE110FD467A\r\n
Cookie: daromad=1\r\n
POST http://www.site.ru/news.html HTTP/1.0\r\n Tarkib uzunligi: 209\r\n
Tarkib uzunligi: 491\r\n Tarkib uzunligi: 209\r\n
Tarkib uzunligi: 209\r\n
Kontent-Dispozitsiya: shakl-ma'lumotlar; name="news_header" Tarkib uzunligi: 209\r\n
POST http://www.site.ru/news.html HTTP/1.0\r\n Tarkib uzunligi: 209\r\n
Misol yangiliklar Tarkib uzunligi: 209\r\n
Kontent-Dispozitsiya: shakl-ma'lumotlar; name="news_fayl"; Tarkib uzunligi: 209\r\n
fayl nomi = "news.txt" Tarkib uzunligi: 209\r\n
Tarkib uzunligi: 209\r\n
Kontent turi: dastur/oktet-stream Tarkib uzunligi: 209\r\n
Kontent-Dispozitsiya: shakl-ma'lumotlar; name = "parol" Tarkib uzunligi: 209\r\n

Kontentni uzatish-kodlash: ikkilik

Juda muhim nuqta. Aksariyat CGI skriptlari aqlli odamlar tomonidan yozilgan, shuning uchun ular Content-Typedagi kiruvchi fayl turini tekshirishni yaxshi ko'radilar. Nima uchun? Ko'pincha veb-saytlarga fayllarni yuklash tashrif buyuruvchidan rasmlarni olish uchun ishlatiladi. Shunday qilib, brauzerning o'zi tashrif buyuruvchi qanday faylni jo'natmoqchi ekanligini aniqlashga harakat qiladi va so'rovga tegishli Content-Type ni kiritadi. Skript uni olgandan keyin tekshiradi va, masalan, agar u gif yoki jpeg bo'lmasa, bu faylni e'tiborsiz qoldiradi. Shuning uchun, so'rovni "qo'lda" yaratishda Content-Type qiymatiga e'tibor bering, shunda u uzatilgan fayl formatiga eng yaqin bo'ladi.

Bizning misolimizda so'rov hosil bo'ladi, unda matn fayli. Ikkilik faylni uzatish uchun so'rov xuddi shu tarzda yaratiladi.

4. Postskript.

Menimcha, serverga so'rovlar yuborish haqida batafsil gapirishning hojati yo'q. Bu sof RHP texnologiyasi masalasi :-). Rasmiy PHP hujjatlaridagi rozetkalar bilan ishlash funktsiyalari yoki CURL modulining funktsiyalari bo'limini diqqat bilan o'qib chiqish kifoya.

Yuqoridagilardan umid qilamanki, nima uchun savol tug'ilishi aniq bo'ldi: "Sarlavha funktsiyasidan foydalangan holda qanday qilib POST so'rovini yaratishim mumkin?" - ma'nosiz.

Header(string) funksiyasi yozuvni faqat soʻrov sarlavhasiga qoʻshadi, lekin soʻrov tanasiga emas.

So'rovning yana bir turi mavjud - Content-Type: ko'p qismli/aralash, umid qilamanki, ushbu maqolani o'qib chiqqandan so'ng siz ushbu turni o'zingiz osongina tushunasiz. Siz uni batafsil o'rganishingiz mumkin

Bu maqola mening maqolalarimdan birida berilgan savolga javobdir.

Ushbu maqolada men sizga HTTP usullari GET/POST/PUT/DELETE va boshqalar nima ekanligini, ular nima uchun ixtiro qilinganligini va ularni REST-ga muvofiq qanday ishlatishni aytib bermoqchiman.

HTTP

Xo'sh, Internetning asosiy protokollaridan biri nima? Men pedantlarni RFC2616 ga yuboraman, qolganlarini esa insoniy tarzda aytaman :)

Ushbu protokol so'rov (So'rov) va javob (Response) deb nomlangan xabarlar asosida qurilgan ikkita kompyuter (mijoz va server) o'rtasidagi o'zaro aloqani tavsiflaydi. Har bir xabar uch qismdan iborat: boshlang'ich chiziq, sarlavhalar va asosiy qism. Bunday holda, faqat boshlang'ich chizig'i talab qilinadi.

So'rov va javobning boshlang'ich satrlari turli formatlarga ega - bizni faqat so'rovning boshlang'ich qatori qiziqtiradi, u quyidagicha ko'rinadi: METOD URI HTTP/ ,

VERSIYA Bu erda METHOD HTTP so'rov usuli, URI manba identifikatori, VERSION protokol versiyasi (uchun hozirgi paytda

Sarlavhalar ikki nuqta bilan ajratilgan nom-qiymat juftliklari to'plamidir. Sarlavhalar turli xil xizmat ma'lumotlarini uzatadi: xabarni kodlash, brauzer nomi va versiyasi, mijoz kelgan manzili (Referrer) va boshqalar.

Xabarning asosiy qismi uzatilayotgan haqiqiy ma'lumotlardir. Javobda uzatiladigan ma'lumotlar, qoida tariqasida, brauzer so'ragan HTML sahifasi bo'lib, so'rovda, masalan, xabarning asosiy qismida serverga yuklangan fayllarning mazmuni uzatiladi. Ammo, qoida tariqasida, so'rovda umuman xabarlar bo'limi yo'q.

HTTP o'zaro ta'siriga misol

Keling, bir misolni ko'rib chiqaylik.

Talab:
GET /index.php HTTP/1.1 Xost: example.com Foydalanuvchi-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Qabul qiling: text/html Ulanish: yopish
Birinchi qator so'rovlar qatori, qolganlari sarlavhalar; xabarning asosiy qismi yo'q

Javob:
HTTP/1.0 200 OK Server: nginx/0.6.31 Content-Language: ru Content-Type: text/html; charset=utf-8 Kontent uzunligi: 1234 Ulanish: yopish ... HTML SAHIFASINI O'ZI...

Resurslar va usullar

Keling, so'rovning boshlang'ich qatoriga qaytaylik va unda URI kabi parametr mavjudligini eslaylik. Bu yagona manba identifikatorini anglatadi - yagona resurs identifikatori. Resurs, qoida tariqasida, serverdagi fayldir (bu holatda URI misoli “/styles.css”), lekin umuman olganda resurs mavhum ob’yekt bo‘lishi ham mumkin (“/blogs/webdev/” – nuqtalar Muayyan faylda emas, balki "Veb" blokini ishlab chiqish").

HTTP so'rov turi (HTTP usuli deb ham ataladi) serverga resursda qanday amalni bajarmoqchi ekanligimizni aytadi. Dastlab (90-yillarning boshlarida) mijoz resursdan faqat bitta narsani - uni qabul qilishni xohlashi mumkin deb taxmin qilingan edi, ammo endi HTTP protokoli yordamida siz xabarlar yaratishingiz, profilni tahrirlashingiz, xabarlarni o'chirishingiz va boshqa ko'p narsalarni qilishingiz mumkin. Va bu harakatlarni "qabul qilish" atamasi bilan birlashtirish qiyin.

HTTP usullari darajasidagi harakatlarni resurslardan farqlash uchun quyidagi variantlar ixtiro qilingan:

  • GET - resurs olish
  • POST - resurs yaratish
  • PUT - resurs yangilanishi
  • DELETE - resursni o'chirish
Shuni esda tutingki, HTTP spetsifikatsiyasi serverdan barcha usullarni tushunishni talab qilmaydi (ulardan 4 dan ortiq) - faqat GET talab qilinadi va serverga ma'lum bir so'rovni qabul qilganda nima qilish kerakligini aytmaydi. usuli. Bu shuni anglatadiki, server DELETE /index.php HTTP/1.1 so'roviga javob beradi majburiy emas GET /index.php HTTP/1.1 so'rovi kabi serverdagi index.php sahifasini o'chirib tashlang majburiy emas index.php sahifasini sizga qaytaring, masalan, uni o'chirib tashlashi mumkin :)

REST o'yinga kiradi

REST (Representational State Transfer) - bu HTTP protokolini ishlab chiquvchilardan biri Roy Filding tomonidan 2000 yilda veb-ilovalarni yaratish tamoyillari guruhining nomi sifatida kiritilgan atama. Umuman olganda, REST HTTP-ga qaraganda kengroq maydonni qamrab oladi - u boshqa protokollar bilan boshqa tarmoqlarda ham ishlatilishi mumkin. REST mijoz va server o'rtasidagi o'zaro ta'sir tamoyillarini "resurs" va "fe'l" tushunchalariga asoslangan holda tavsiflaydi (sub'ekt va predikat sifatida tushunish mumkin). HTTP holatida resurs URI orqali aniqlanadi va fe'l HTTP usuli hisoblanadi.

REST turli xil manbalar uchun bir xil URI dan foydalanishdan voz kechishni taklif qiladi (ya'ni, /index.php?article_id=10 va /index.php?article_id=20 kabi ikki xil maqolaning manzillari - bu REST usuli emas) va turli harakatlar uchun turli HTTP usullaridan foydalanish. Ya'ni, REST yondashuvidan foydalangan holda yozilgan veb-ilova HTTP DELETE usuli bilan kirishda resursni o'chiradi (albatta, bu hamma narsani va hammani o'chirish imkoniyatini berish kerakligini anglatmaydi, lekin har qanday ilovaning o'chirish so'rovi HTTP DELETE usulidan foydalanishi kerak).

REST dasturchilarga standartlashtirilgan va avvalgidan biroz chiroyliroq veb-ilovalarni yozish imkoniyatini beradi. REST-dan foydalanib, yangi foydalanuvchi qo'shish uchun URI /user.php?action=create (GET/POST usuli) emas, balki oddiygina /user.php (qat'iy POST usuli) bo'ladi.

Natijada, mavjud HTTP spetsifikatsiyasi va REST yondashuvini birlashtirib, turli HTTP usullari nihoyat mantiqiy bo'ladi. GET - resursni qaytaradi, POST - yangisini yaratadi, PUT - mavjudni yangilaydi, DELETE - uni o'chiradi.

Muammolar bormi?

Ha, amalda REST-dan foydalanishda kichik muammo bor. Bu muammo HTML deb ataladi.

PUT/DELETE so'rovlari XMLHttpRequest yordamida server bilan qo'lda bog'lanish orqali yuborilishi mumkin (masalan, curl yoki hatto telnet orqali), lekin siz to'liq huquqli PUT/DELETE so'rovini yuboradigan HTML formasini yarata olmaysiz.

Gap shundaki, HTML spetsifikatsiyasi GET yoki POST orqali boshqa ma'lumotlarni yuboradigan shakllarni yaratishga ruxsat bermaydi. Shuning uchun, boshqa usullar bilan normal ishlash uchun siz ularni sun'iy ravishda taqlid qilishingiz kerak. Masalan, Rack-da (buning asosida Ruby veb-server bilan o'zaro ta'sir qiladigan mexanizm; Rails, Merb va boshqa Ruby ramkalari Rack yordamida amalga oshiriladi) formaga "_method" nomi bilan yashirin maydon qo'shishingiz mumkin va qiymat sifatida usul nomini belgilang (masalan, "PUT") - bu holda, POST so'rovi yuboriladi, lekin Rack POST emas, balki PUT olganini ko'rsatishi mumkin.