IlmHamroh
JavaScript Full-stack/2-qism. Internet, veb va brauzer6/20-dars12 daqiqa
Mundarija (33)

HTTP so'rov va javob: client–server modeli va HTTP xabari tuzilishi

Qisqacha: Vebda mijoz (masalan, brauzer) serverga HTTP so'rov yuboradi, server esa HTTP javob qaytaradi. Ikkalasi ham tuzilmali matnli xabar: birinchi qator, sarlavhalar (headers), bo'sh qator va body (tana). HTTP "xotirasiz": server har bir so'rovni avvalgilaridan mustaqil qabul qiladi.

Bu darsda

  • Mijoz (client) va server kimligini va muloqotni kim boshlashini tushuntira olasiz.
  • HTTP so'rovining qismlarini — so'rov qatori, sarlavhalar, bo'sh qator, body — ajrata olasiz.
  • HTTP javobining tuzilishini o'qiy olasiz.
  • curl -v va curl -i bilan haqiqiy so'rov va javobni ko'ra olasiz.
  • HTTP'ning stateless tabiatini va u nimaga olib kelishini bilasiz.

Oldin bilishingiz kerak: URL anatomiyasi, Protokol qatlamlari: TCP va UDP, JSON: dasturlar tili.

1. Nega bu kerak?

Siz brauzerda https://example.com ni ochdingiz. Ekranda "Example Domain" yozuvi paydo bo'ldi. Siz bitta harakat qildingiz, lekin parda ortida brauzer va server o'rtasida xat almashildi: "Menga bosh sahifani ber" — "Mana, HTML". Katta saytlarda bunday xatlar bir sahifa uchun o'nlab, hatto yuzlab bo'ladi.

Bu xatlar qanday tilda yoziladi? Unda nima bo'ladi? Frontend dasturchi so'rov yuboradi, backend dasturchi unga javob yozadi. Ikkalasi ham shu "xat" tuzilishini aniq bilishi kerak. Aks holda "sayt nega ishlamayapti?" savoliga javob topib bo'lmaydi.

Oldingi darslarda yo'lni qurdik: IP, port, TCP, DNS, URL. Bugun shu yo'ldan yuradigan xabarning o'zini ochib ko'ramiz.

2. Mijoz va server

2.1 Choyxonadagi kabi

Birinchi darsimizdagi choyxonani eslang. Mehmon buyurtma beradi, oshxona tayyorlab, taomni chiqaradi. Oshxona mehmonning uyiga o'zi borib "osh yeysizmi?" deb so'ramaydi — har doim mehmon birinchi bo'lib so'raydi.

Vebda ham shunday ikki tomon bor:

Mijoz (client) — xizmat so'raydigan tomon. U muloqotni doim birinchi bo'lib boshlaydi. Mijoz bo'lishi mumkin: brauzer, telefondagi ilova, terminaldagi curl, hatto boshqa server.

Server — so'rovni kutib turadigan va javob beradigan dastur. U portda "tinglab" turadi: masalan, 443-portda. So'rov kelsa — ishlab chiqib, javob qaytaradi.

"Server" so'zi ikki ma'noda ishlatiladi: shu dastur va u ishlayotgan kompyuter. Gapdan qaysi biri nazarda tutilgani odatda tushunarli bo'ladi.

2.2 Bitta kompyuter — ikkala rol

Mijoz va server — bu kompyuter turi emas, rol. Sizning noutbukingizda ham server ishlashi mumkin: http://localhost:3000 dagi loyihangiz aynan shunday. Brauzeringiz o'sha paytda mijoz, loyihangiz esa server bo'ladi — ikkalasi bitta kompyuterda.

Server ham boshqa serverga mijoz bo'lishi mumkin. Masalan, do'kon serveri to'lovni tekshirish uchun Click yoki Payme serveriga so'rov yuboradi. O'sha lahzada do'kon serveri — mijoz.

Tekshirib ko'ring: Telegram bot foydalanuvchiga ob-havo ma'lumotini beradi. Buning uchun u ob-havo xizmati serveriga so'rov yuboradi. Bu muloqotda bot qaysi rolda?

Javob

Mijoz rolida. U so'rovni birinchi bo'lib yuboryapti, ob-havo xizmati esa javob beryapti. Foydalanuvchi bilan muloqotda esa bot boshqa rolda bo'lishi mumkin — rol kompyuterga emas, aynan shu muloqotga bog'liq.

3. HTTP va so'rov–javob sikli

3.1 HTTP nima?

HTTP (HyperText Transfer Protocol) — vebda mijoz va server gaplashadigan protokol. U ilova qatlamida ishlaydi: TCP (yoki QUIC) xabarni yetkazadi, HTTP esa xabarning mazmuni va tuzilishini belgilaydi. HTTPS — shu HTTP, faqat shifrlangan.

Muloqot doim bir xil ritmda boradi: bitta so'rov — bitta javob. Bu so'rov–javob sikli (request–response) deyiladi.

sequenceDiagram
    participant B as Brauzer
    participant S as Server
    Note over B,S: DNS va TCP ulanish tayyor
    B->>S: GET / (sahifani ber)
    S-->>B: 200 OK + HTML
    Note over B: HTML'da rasm va stil bor
    B->>S: GET /style.css
    S-->>B: 200 OK + CSS
    B->>S: GET /logo.png
    S-->>B: 200 OK + rasm

Brauzer avval HTML'ni oladi, uni o'qiydi va unda yana nimalar kerakligini ko'radi: stil fayli, rasmlar, skriptlar. Har biri uchun alohida so'rov yuboriladi. Bitta sahifa — ko'p so'rov.

3.2 curl -v — xatlarni ko'rish oynasi

Brauzer bu xatlarni sizdan yashiradi. curl -v (verbose — "batafsil") esa ularni ko'rsatadi. PowerShell darsidan eslang: Windows PowerShell'da curl.exe deb yozamiz:

powershell
curl.exe -v https://example.com -o NUL

-o NUL — "sahifa matnini ekranga chiqarma", faqat xabarlarni ko'ramiz. Git Bash'da -o /dev/null yoziladi. Chiqishda uch xil qator bor:

  • * — curl'ning o'z izohlari: DNS, ulanish, shifrlash.
  • > — siz yuborgan so'rov.
  • < — server qaytargan javob.

Keyingi ikki bo'limda aynan shu chiqishni bo'laklaymiz.

4. HTTP so'rovining tuzilishi

4.1 Haqiqiy so'rov

curl -v chiqishidan > qatorlari (haqiqiy):

text
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/8.21.0
> Accept: */*
>

Bu — serverga ketgan to'liq xabar. U to'rt qismdan iborat.

4.2 1-qism: so'rov qatori

So'rov qatori (request line) — xabarning birinchi qatori. Unda uch narsa bor, bo'sh joy bilan ajratilgan:

text
GET   /   HTTP/1.1
 |    |      |
metod path  versiya
  • Metod — nima qilmoqchimiz. GET — "menga ber". Metodlarni keyingi darsda batafsil ko'ramiz.
  • Path va query — URL'ning server ichidagi qismi. Bu yerda / — bosh sahifa.
  • Versiya — HTTP'ning qaysi versiyasi.

URL'ning qolgan qismlari qayerga ketdi? URL darsini eslang: host alohida sarlavhaga (Host) yoziladi, fragment esa umuman yuborilmaydi.

4.3 2-qism: sarlavhalar

Sarlavhalar (headers) — so'rov haqida qo'shimcha ma'lumot. Har biri alohida qatorda, Nomi: qiymat ko'rinishida. Nomlarda katta-kichik harf farq qilmaydi: Host va host bir xil.

  • Host: example.com — qaysi saytga murojaat qilinyapti. Bitta serverda yuzlab sayt bo'lishi mumkin, server qaysi biri kerakligini shu sarlavhadan biladi. HTTP/1.1'da u majburiy.
  • User-Agent: curl/8.21.0 — mijoz kim: qaysi dastur va versiya. Brauzerda bu yerda uzun matn bo'ladi (Mozilla/5.0 (Windows NT 10.0; ...) Chrome/...).
  • Accept: */* — mijoz qanday turdagi javobni qabul qiladi. */* — "istalganini".

Sarlavhalar ko'p va har birining o'z vazifasi bor. Eng muhimlarini sarlavhalar darsida o'rganamiz.

4.4 3-qism: bo'sh qator

Sarlavhalardan keyin bitta bo'sh qator keladi. Yuqoridagi chiqishdagi oxirgi > — aynan u. Bo'sh qator serverga "sarlavhalar tugadi" deydi.

Qator oxirlari HTTP'da CRLF (\r\n) bilan belgilanadi — qator oxiri darsidagi Windows uslubi. Bo'sh qator — ketma-ket ikkita qator oxiri.

4.5 4-qism: body

Body (tana) — xabarning asosiy "yuki". GET so'rovida body bo'lmaydi: siz narsa olyapsiz, yubormayapsiz. Server'ga ma'lumot yuborganda esa — masalan, ro'yxatdan o'tish formasi yoki yangi post — body kerak.

Ma'lumot yuboradigan so'rov qanday ko'rinishini ko'raylik. Bu yerda POST — "yangi narsa qo'sh" metodi (keyingi darsda ko'ramiz), body esa JSON. Haqiqiy chiqishdan (User-Agent va Accept qatorlari qisqartirildi):

text
> POST /posts HTTP/1.1
> Host: jsonplaceholder.typicode.com
> Content-Type: application/json
> Content-Length: 28
>
{"title":"Salom","userId":1}

Ikki yangi sarlavha paydo bo'ldi:

  • Content-Type: application/json — "body'dagi ma'lumot JSON formatida".
  • Content-Length: 28 — "body 28 bayt". Sanab ko'ring: {"title":"Salom","userId":1} — aynan 28 belgi. Server shuncha bayt o'qiydi va xabar tugaganini biladi.

(jsonplaceholder.typicode.com — dasturchilar mashq qilishi uchun ochiq bepul server. U so'rovni qabul qiladi, lekin hech narsani haqiqatan saqlamaydi.)

Tekshirib ko'ring: Brauzer https://example.com/menyu?taom=osh#narxlar ni ochdi. So'rov qatori qanday bo'ladi? Host sarlavhasi-chi?

Javob

So'rov qatori: GET /menyu?taom=osh HTTP/1.1. Sarlavha: Host: example.com. Path va query so'rov qatoriga, host — Host sarlavhasiga ketdi. #narxlar fragmenti hech qayerga yozilmaydi — u brauzerda qoladi.

5. HTTP javobining tuzilishi

5.1 Haqiqiy javob

Server javobi ham xuddi shu to'rt qismdan iborat. curl -i javobning sarlavhalarini ham, body'sini ham ko'rsatadi (-i — include, "sarlavhalarni qo'sh"):

powershell
curl.exe -i https://jsonplaceholder.typicode.com/todos/1

Haqiqiy javob (sarlavhalar qisqartirilgan):

text
HTTP/1.1 200 OK
Date: Mon, 28 Sep 2026 12:31:11 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 83
Connection: keep-alive
Server: cloudflare

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

5.2 Holat qatori

Holat qatori (status line) — javobning birinchi qatori:

text
HTTP/1.1   200   OK
   |        |     |
versiya   kod   izoh
  • Status kodi — uch xonali son: nima bo'ldi. 200 — "hammasi yaxshi".
  • Izoh — shu kodning odam uchun yozilgan nomi. Dasturlar faqat kodga qaraydi.

Status kodlarini keyingi darsda to'liq o'rganamiz.

5.3 Javob sarlavhalari va body

Javob sarlavhalari body haqida va server haqida ma'lumot beradi:

  • Content-Type: application/json; charset=utf-8 — body JSON, UTF-8 kodlashda. HTML sahifa bo'lsa, text/html bo'lardi.
  • Content-Length: 83 — body 83 bayt.
  • Date — javob qachon tayyorlangani.
  • Server — javob bergan server dasturi.
  • Connection: keep-alive — "TCP ulanishni yopmay tur, keyingi so'rov ham shu yo'ldan kelsin". TCP darsidagi handshake har safar takrorlanmaydi — vaqt tejaladi.

Bo'sh qatordan keyin body — mijoz so'ragan narsaning o'zi. Bu yerda — JSON. example.com da esa HTML bo'ladi: <!doctype html><html lang="en"><head><title>Example Domain</title>.... Rasm so'ralgan bo'lsa — rasmning binar baytlari.

Maslahat: Brauzerda ham hammasini ko'rish mumkin: F12 tugmasini bosing va Network bo'limini oching. Sahifani yangilasangiz, har bir so'rov ro'yxatda chiqadi. Bu vositani DevTools darsida o'rganamiz.

6. HTTP/1.1, HTTP/2 va HTTP/3 — tuzilishi bir xil

Yuqoridagi matnli xabarlar HTTP/1.1 ko'rinishida. Zamonaviy brauzerlar ko'pincha HTTP/2 yoki HTTP/3 ishlatadi. Ularda xabar matn emas, ixcham binar ko'rinishda yuboriladi.

Lekin mazmuni o'zgarmaydi: baribir metod, path, sarlavhalar, body, status kodi bor. Shuning uchun bugun o'rgangan tuzilish HTTP'ning har qanday versiyasida ishlaydi. Versiyalar farqini alohida darsda ko'ramiz.

7. Stateless: server sizni eslab qolmaydi

7.1 Har bir so'rov — yangi tanishuv

HTTP'ning eng muhim xususiyatlaridan biri — u stateless ("holatsiz", xotirasiz). Server har bir so'rovni mutlaqo mustaqil qabul qiladi. Oldingi so'rovda nima bo'lganini o'zi eslab qolmaydi.

text
1-so'rov: "Men Aliman, mana parolim"   → "Xush kelibsiz, Ali!"
2-so'rov: "Savatimni ko'rsat"          → "Kechirasiz, siz kimsiz?"

Nega bunday qilingan? Server millionlab so'rovga xizmat qiladi. Har bir mijozni "eslab yurish" uni og'irlashtirardi. Mustaqil so'rovlarni esa istalgan serverga berish mumkin — bir nechta server bo'lsa ham, qaysi biri javob berishi farq qilmaydi.

7.2 Unda login qanday ishlaydi?

Agar server eslamasa, saytga bir marta kirsangiz, keyingi sahifada qanday qilib "kirgan" holatda qolasiz?

O'xshatish: teatr garderobi. Paltongizni topshirasiz, garderobchi sizga raqamli jeton beradi. U sizning yuzingizni eslab qolmaydi. Qaytganingizda jetonni ko'rsatasiz — u raqamga qarab paltoni topadi.

Vebda ham shunday. Login muvaffaqiyatli bo'lsa, server javob bilan birga "jeton" beradi. Brauzer uni saqlaydi va har bir keyingi so'rov sarlavhasiga qo'shib yuboradi. Server har safar jetonga qarab kimligingizni biladi. Bu jetonlar cookie va token deb ataladi. Cookie'ni sarlavhalar darsida ko'ramiz.

Tekshirib ko'ring: Nega "HTTP stateless" degani "saytlar foydalanuvchini eslay olmaydi" degani emas?

Javob

Protokolning o'zi eslamaydi — lekin mijoz har bir so'rovda "men kimman" degan belgini (cookie yoki token) yuboradi. Server shu belgiga qarab foydalanuvchini har safar qaytadan taniydi. Xotira HTTP'ning ichida emas, har bir so'rov bilan birga keladigan belgida.

8. Ko'p uchraydigan xatolar

8.1 PowerShell'da curl -v boshqacha ishlaydi

Windows PowerShell 5.1'da curl — boshqa buyruqning taxallusi (alias). curl -v https://example.com yozsangiz, xabarlar o'rniga shunday chiqadi:

text
VERBOSE: GET with 0-byte payload
VERBOSE: received -1-byte response of content type text/html

Tarjimasi: "BATAFSIL: 0 baytli yuk bilan GET; text/html turidagi javob olindi". Bu haqiqiy curl emas — Invoke-WebRequest o'zining "batafsil" rejimida ishladi. Yechim: curl.exe -v ... deb yozing.

8.2 > va < ni adashtirish

curl -v chiqishida > — siz yuborgan, < — siz olgan. Eslab qolish usuli: o'q yo'nalishi. > "chiqib ketyapti", < "kirib kelyapti".

8.3 Host sarlavhasisiz so'rov

HTTP/1.1'da Host majburiy. Uni olib tashlab so'rov yuborsak (curl da -H "Host:"), server rad etadi:

text
HTTP/1.1 400 Bad Request

Tarjimasi: "Noto'g'ri tuzilgan so'rov". Qo'lda so'rov yozadigan vositalarda (masalan, testlash dasturlarida) bu xato ba'zan uchraydi.

8.4 "Server o'zi xabar yuboradi" deb kutish

Oddiy HTTP'da server mijozga faqat javob beradi — so'ralmagan xabarni o'zi yubora olmaydi. Chatdagi yangi xabarlar yoki jonli bildirishnomalar uchun boshqa usullar kerak (WebSocket va boshqalar). Ularni HTTP versiyalari va real-time darsida ko'ramiz.

9. Mashqlar

1-mashq (oson): Xabarni bo'laklang

Quyidagi so'rovda metod, path, query, host va body qaysi?

text
GET /kitoblar?janr=roman HTTP/1.1
Host: example.com
Accept: text/html
Yechim
  • Metod: GET
  • Path: /kitoblar, query: janr=roman
  • Versiya: HTTP/1.1
  • Host: example.com (sarlavhadan)
  • Body: yo'q — bo'sh qatordan keyin hech narsa kelmagan. GET so'rovida bu odatiy.

2-mashq (o'rta): Haqiqiy suhbatni o'qing

curl.exe -v https://example.com -o NUL ni ishga tushiring. Chiqishdan toping:

  1. So'rov qatori.
  2. User-Agent qiymati — curl versiyangiz qaysi?
  3. Holat qatori.
  4. Content-Type qiymati — body qanday turdagi?
Yechim
  1. > GET / HTTP/1.1
  2. Masalan, > User-Agent: curl/8.21.0 — versiya sizda boshqacha bo'lishi mumkin.
  3. < HTTP/1.1 200 OK
  4. < Content-Type: text/html — body HTML sahifa.

* bilan boshlangan qatorlarda esa DNS natijasi (IPv4: ...) va ulanish (Established connection to example.com ... port 443) ko'rinadi — oldingi darslarda o'rganganlaringiz.

3-mashq (qiyin): JSON javob

curl.exe -i https://jsonplaceholder.typicode.com/users/1 ni ishga tushiring.

  1. Status kodi nechchi?
  2. Body qanday formatda? Buni qaysi sarlavhadan bildingiz?
  3. Body'dan foydalanuvchining name va email qiymatlarini toping.
  4. /users/1 ni /users/2 ga almashtiring. Qaysi qism o'zgardi: so'rov qatorimi, sarlavhami?
Yechim
  1. 200 — HTTP/1.1 200 OK.
  2. JSON: Content-Type: application/json; charset=utf-8.
  3. "name": "Leanne Graham", "email": "Sincere@april.biz". (Bu — sinov uchun o'ylab topilgan ma'lumot.)
  4. Faqat so'rov qatori: GET /users/2 HTTP/1.1. Host o'sha-o'sha. Javob body'sida boshqa foydalanuvchi keladi. Bitta server, bitta host — path har xil resursni ko'rsatadi.

10. Real ishda

  • Frontend. JavaScript'dagi fetch (keyinroq o'rganasiz) aynan shu so'rovni yuboradi: metod, sarlavhalar, body. Javobdan status kodi va body'ni o'qiysiz.
  • Backend. Express yoki NestJS'da (server yozish vositalari, kursda o'rganamiz) yozgan har bir funksiyangiz bitta so'rovni oladi va bitta javob qaytaradi. So'rov qatori, sarlavha va body — kundalik ish materiali.
  • Nosozlikni topish. "Ilova ishlamayapti" — birinchi qadam: so'rov ketdimi, qanday javob keldi? DevTools'ning Network bo'limi yoki curl -v bir daqiqada ko'rsatadi.
  • Testlash vositalari. Postman, Insomnia kabi dasturlar qo'lda HTTP so'rov yuborish uchun. Ularning oynasi aynan shu to'rt qismdan iborat.
  • Intervyu savoli: "HTTP so'rovi qanday qismlardan iborat?", "Stateless nima degani?" — bu darsdagi javoblar yetarli.

Xulosa

  • Mijoz so'raydi, server javob beradi. Muloqotni doim mijoz boshlaydi. Bular — kompyuter turi emas, rol.
  • HTTP xabari to'rt qismli: birinchi qator, sarlavhalar, bo'sh qator, body.
  • So'rov qatori: metod + path/query + versiya (GET /menyu HTTP/1.1). Host — Host sarlavhasida.
  • Holat qatori: versiya + status kodi + izoh (HTTP/1.1 200 OK).
  • curl.exe -v — > yuborilgan, < olingan. curl.exe -i — javob sarlavhalari va body.
  • HTTP stateless: "kimligingiz" har bir so'rovda cookie yoki token bilan yuboriladi.

Keyingi dars: HTTP metodlari va status kodlari — GET, POST, PUT, PATCH, DELETE nimani anglatadi va 200, 404, 500 kabi kodlar nima haqida gapiradi.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
HTTP so'rov va javob: client–server modeli va HTTP xabari tuzilishi — IlmHamroh