curl va wget — HTTP so'rovlar va yuklab olish
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;-Isarlavhalar;-vdebug;-Lyo'naltirishlarcurl --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 vaqtcurl -sf— skriptlarda healthcheck--resolve— DNS siz yangi serverni sinashwget -c URL— yuklab olish va davom ettirish- DevTools → Copy as cURL
Keyingi dars
34-dars: SSH — kalitlar, ~/.ssh/config, agent