Web server nima?
Brauzerda google.com yozsangiz, qayerdadir ishlab turgan kompyuter so'rovingizni qabul qiladi, kerakli ma'lumotni topadi va sizga yuboradi. Shu kompyuter (to'g'rirog'i, unda ishlaydigan dastur) — web server.
Web server — tarmoq orqali kelgan so'rovlarga javob qaytaradigan dastur. U doimiy ishlaydi, portni "tinglaydi" va har bir kelgan so'rov uchun javob shakllantiradi.
Klient va server
Web dagi har bir aloqa ikki tomonda bo'ladi:
Klient (brauzer, mobil ilova, curl)
|
| So'rov (Request)
↓
Server (sizning Go dasturingiz)
|
| Javob (Response)
↓
Klient
Klient — so'rov yuboruvchi. Odatda brauzer yoki mobil ilova, ba'zan boshqa server ham klient bo'ladi.
Server — so'rovni qabul qilib, javob qaytaruvchi. U bir vaqtda minglab klientlarga xizmat ko'rsatishi mumkin.
HTTP protokoli
Klient va server o'rtasidagi "til" — HTTP (HyperText Transfer Protocol). Bu ikki taraf nimani qanday yuborishini belgilaydigan qoidalar to'plami.
HTTP so'rovi quyidagicha ko'rinadi:
Birinchi qatorda uchta narsa bor:
- GET — metod (nima qilinayapti)
- /users — yo'l (qayerdan)
- HTTP/1.1 — protokol versiyasi
HTTP javobi:
Birinchi qatorda 200 OK — status kodi. Keyin sarlavhalar, bo'sh qator, va tanasi (body).
Port nima?
Bir kompyuterda bir vaqtda ko'p dastur ishlashi mumkin. Port — ma'lum bir dasturga yo'naltirilgan "eshik raqami".
kompyuter IP: 192.168.1.1
Port 80 → HTTP server
Port 443 → HTTPS server
Port 5432 → PostgreSQL
Port 8080 → Sizning Go serveringiz
Brauzerda http://localhost:8080 yozilganda, brauzer shu kompyuterning 8080 portiga ulanadi.
localhost — "shu kompyuter" degan ma'noda. Tashqi tarmoqda IP manzil ishlatiladi.
Go'da minimal web server
Go standart kutubxonadagi net/http paketi web server yozish uchun kerakli hamma narsani beradi. Hech qanday qo'shimcha kutubxona kerak emas.
| main.go | |
|---|---|
Dasturni ishga tushiring:
Brauzerda http://localhost:8080 ni oching:
Server ishlayapti. Terminalda Ctrl+C bilan to'xtating.
Kod qanday ishlaydi?
http.HandleFunc
/ yo'liga kelgan har bir so'rovni boshSahifa funksiyasiga yo'naltiradi. Bu "routing" — qaysi yo'lga qaysi funksiya javob berishi.
boshSahifa funksiyasi ikki argument qabul qiladi:
w http.ResponseWriter— javob yozish uchun. Bu orqali klientga ma'lumot yuboriladi.r *http.Request— kelgan so'rov. Unda metod, yo'l, sarlavhalar, tanasi bor.
http.ListenAndServe
Dasturni 8080 portda so'rovlarni tinglashga qo'yadi. :8080 — barcha tarmoq interfeyslarida shu port. nil — standart router ishlatiladi (yuqorida HandleFunc bilan qo'shilganlar).
Bu chaqiruv bloklovchi — dastur shu qatorda "turib qoladi" va har kelgan so'rovni qayta ishlaydi. Xato bo'lsa qaytaradi, shuning uchun ishlab turgan paytda odatda qaytish bo'lmaydi.
fmt.Fprintln
fmt.Println terminalga yozadi. fmt.Fprintln birinchi argument — qayerga yozish kerakligini belgilaydi. w (ResponseWriter) ga yozish — klientga javob yuborish.
Bir nechta yo'l
Endi /, /haqida, /salom yo'llari ishlaydi. Boshqa yo'llarga (/qandaydir) so'rov kelsa, Go standart 404 page not found javobini qaytaradi.
So'rov ma'lumotlarini o'qish
r *http.Request orqali kelgan so'rov haqida ma'lumot olish mumkin:
Brauzerda http://localhost:8080/test ga kirsangiz:
Status kodi yuborish
Standartda javob 200 OK status kodi bilan keladi. Boshqa status kodini yuborish uchun w.WriteHeader():
func topilmadi(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
fmt.Fprintln(w, "Sahifa topilmadi")
}
http.StatusNotFound — 404 ning o'rniga ishlatiladigan konstantа.
Warning
w.WriteHeader() fmt.Fprintln(w, ...) dan oldin chaqirilishi kerak. Tanaga biror narsa yozilgandan keyin status kodi o'zgartirib bo'lmaydi.
Ko'p uchraydigan savollar
nil o'rniga nima qo'yish mumkin?
http.ListenAndServe ikkinchi argument sifatida http.Handler interfeysini qabul qiladi. nil — standart http.DefaultServeMux ishlatiladi, ya'ni http.HandleFunc bilan qo'shilganlar. Keyinchalik gorilla/mux yoki chi kabi routerlar shu o'ringa qo'yiladi.
Xatolarni qanday qarayman?
Port band bo'lsa yoki ruxsat bo'lmasa, ListenAndServe xato qaytaradi.
8080 portni ishlatish shart emasmi?
Yo'q. Istalgan bo'sh portni ishlatish mumkin. 1024 dan past portlar (80, 443) tizim ruxsatini talab qiladi, shuning uchun ishlab chiqishda 8080, 3000, 9000 kabi portlar odatiy.
Keyingi qadam
Bu minimal server matn javob qaytaradi. Haqiqiy API JSON qaytaradi, so'rov tanasini o'qiydi, bazadan ma'lumot oladi. Bularni keyingi darslarda ko'ramiz.