curl va wget — HTTP so'rovlar va yuklab olish

~12 daq · Linux · Tarmoq

Muammodan boshlaylik

API endpoint yozdingiz. Uni serverda tekshirish kerak — brauzer yo'q, Postman yo'q. Yoki: ilova "502 Bad Gateway" qaytaryapti — Nginx muammosimi yoki ilovaning o'zi? Yoki: serverga 500 MB lik faylni yuklab olish kerak.

Terminalda HTTP bilan ishlashning ikki asosiy vositasi: curl — HTTP ning "shveytsar pichog'i", wget — yuklab olish uchun.


curl — asoslar

curl https://api.github.com

Javob tanasi (body) ekranga chiqadi. curl standart holatda GET so'rov yuboradi.

Sarlavhalarni ko'rish

curl -I https://dokon.uz             # faqat sarlavhalar (HEAD so'rov)
HTTP/2 200
server: nginx
content-type: text/html; charset=utf-8
cache-control: no-cache
curl -i https://dokon.uz             # sarlavhalar + tana
curl -v https://dokon.uz             # batafsil: ulanish, TLS, so'rov va javob sarlavhalari

-v — debug uchun eng foydali: so'rov qayerda "qotib qolayotgani" ko'rinadi (DNS? TCP ulanish? TLS? Javob?).

Asosiy bayroqlar

Bayroq Nima
-I Faqat sarlavhalar
-i Sarlavhalar + tana
-v Batafsil (debug)
-s Jim (progress yo'q)
-S -s bilan — xatolarni baribir ko'rsatish
-L Yo'naltirishlarga (301/302) ergashish
-o fayl Natijani faylga
-O Serverdagi nom bilan saqlash
-X POST HTTP usuli
-H "..." Sarlavha qo'shish
-d '...' So'rov tanasi
-f HTTP xatosida (4xx/5xx) chiqish kodi ≠ 0
-w '...' Qo'shimcha ma'lumotni formatlab chiqarish

API bilan ishlash

GET va JSON

curl -s https://api.github.com/users/torvalds | jq

jq — JSON ni chiroyli chiqarish va filtrlash (sudo apt install jq):

curl -s https://api.github.com/users/torvalds | jq '.name, .public_repos'
curl -s localhost:3000/api/mahsulotlar | jq '.[0]'
curl -s localhost:3000/api/mahsulotlar | jq '.[] | {nom, narx}'
curl -s localhost:3000/api/mahsulotlar | jq 'length'

POST — JSON yuborish

curl -X POST localhost:3000/api/mahsulotlar \
  -H "Content-Type: application/json" \
  -d '{"nom": "Noutbuk", "narx": 8500000}'

-d bo'lsa, curl avtomatik POST ishlatadi — -X POST ixtiyoriy. Zamonaviy curl (7.82+) da qisqaroq:

curl --json '{"nom": "Noutbuk", "narx": 8500000}' localhost:3000/api/mahsulotlar

Tanani fayldan:

curl --json @mahsulot.json localhost:3000/api/mahsulotlar

PUT, PATCH, DELETE

curl -X PUT    localhost:3000/api/mahsulotlar/42 --json '{"narx": 8000000}'
curl -X DELETE localhost:3000/api/mahsulotlar/42

Autentifikatsiya

curl -H "Authorization: Bearer eyJhbGciOi..." localhost:3000/api/profil
curl -u admin:parol https://example.com/admin       # Basic auth

Token ni o'zgaruvchida saqlash qulay:

TOKEN=$(curl -s --json '{"login":"admin","parol":"..."}' localhost:3000/api/login | jq -r .token)
curl -H "Authorization: Bearer $TOKEN" localhost:3000/api/profil

Formalar va fayl yuklash

curl -d "login=admin&parol=123" localhost:3000/login          # form-urlencoded
curl -F "rasm=@avatar.png" -F "ism=Otabek" localhost:3000/upload   # multipart, fayl bilan

[!TIP] Brauzerning DevTools → Network tabida istalgan so'rovni o'ng tugma → Copy as cURL — tayyor curl buyrug'i. Serverda aynan shu so'rovni takrorlash uchun ajoyib.


Diagnostika

Javob vaqti

curl -s -o /dev/null -w "status: %{http_code}  vaqt: %{time_total}s\n" https://dokon.uz
status: 200  vaqt: 0.184s

Batafsil — qaysi bosqich sekin:

curl -s -o /dev/null -w "dns: %{time_namelookup}  ulanish: %{time_connect}  tls: %{time_appconnect}  birinchi bayt: %{time_starttransfer}  jami: %{time_total}\n" https://dokon.uz

birinchi bayt katta bo'lsa — server (ilova yoki baza) sekin; dns katta bo'lsa — DNS muammosi.

"502 Bad Gateway" — kim aybdor?

curl -I https://dokon.uz            # tashqaridan — Nginx orqali: 502
curl -I localhost:3000              # serverda — ilovaning o'ziga to'g'ridan-to'g'ri

Ikkinchisi ishlamasa — muammo ilovada (systemctl status, journalctl). Ishlasa — Nginx sozlamasida (43-dars).

Ma'lum domenni boshqa IP ga yo'naltirish

DNS ni o'zgartirmasdan yangi serverni sinash:

curl --resolve dokon.uz:443:45.12.34.99 https://dokon.uz

Healthcheck skriptlarda

if curl -sf localhost:3000/health > /dev/null; then
  echo "OK"
else
  echo "Ilova javob bermayapti!"
fi

-f — 4xx/5xx da xato kodi qaytaradi; -s — jim.


wget — yuklab olish

wget https://nodejs.org/dist/v22.11.0/node-v22.11.0-linux-x64.tar.xz

Progress bilan, serverdagi nom bilan saqlaydi.

wget -O node.tar.xz https://...      # boshqa nom bilan
wget -c https://.../katta.iso        # uzilgan yuklashni davom ettirish
wget -q https://...                  # jim
wget -i royxat.txt                   # fayldagi barcha URL lar
wget -b https://.../katta.iso        # fonda

-c (continue) — katta fayllar uchun juda foydali: aloqa uzilsa, boshidan emas, to'xtagan joyidan davom etadi.

curl bilan ham:

curl -LO https://.../fayl.tar.gz            # -L yo'naltirish, -O asl nom
curl -L -C - -O https://.../katta.iso       # davom ettirish

curl yoki wget?

Vazifa Tanlov
API sinash, sarlavhalar, POST, debug curl
Faylni yuklab olish, davom ettirish wget (yoki curl -LO)
Skriptda HTTP so'rov curl (hamma joyda bor, macOS da ham)
Saytni rekursiv yuklab olish wget -r

Nima uchun shunday?

Nima uchun Postman bor bo'lsa ham curl ni bilish kerak?

Chunki curl — universal til. U har bir serverda, har bir Docker image da (yoki bir buyruqda o'rnatiladi), har bir CI tizimida mavjud. API hujjatlari misollarni curl da yozadi; Stack Overflow dagi javoblar curl da; brauzer "Copy as cURL" beradi; Postman ham curl ni import va eksport qiladi. curl buyrug'i — bu so'rovning aniq, to'liq va takrorlanadigan tavsifi: uni hamkasbga yuborish, skriptga qo'yish yoki serverda ishga tushirish mumkin. Grafik vositalar qulay, lekin curl — hamma joyda tushuniladigan "lingua franca".


Xulosa

Eslab qoling:

  • curl URL — GET; -I sarlavhalar; -v debug; -L yo'naltirishlar
  • curl --json '{...}' URL — JSON POST; -X PUT/DELETE
  • -H "Authorization: Bearer ..." — sarlavha
  • | jq — JSON ni o'qish va filtrlash
  • -w "%{http_code} %{time_total}" — status va vaqt
  • curl -sf — skriptlarda healthcheck
  • --resolve — DNS siz yangi serverni sinash
  • wget -c URL — yuklab olish va davom ettirish
  • DevTools → Copy as cURL

Keyingi dars

34-dars: SSH — kalitlar, ~/.ssh/config, agent