HTTP POST and Custom Requests
HTTP POST va maxsus so'rovlar
GET so'rovlari ma'lumotni URL orqali uzatadi, lekin POST so'rovlari ma'lumotni so'rov tanasi (body) orqali yuboradi — odatda JSON formatida, yangi resurs yaratish uchun ishlatiladi. So'rovga qo'shimcha ma'lumot berish uchun sarlavhalar (headers) ham qo'shiladi.
body := strings.NewReader(`{"name":"Aziz"}`)
req := httptest.NewRequest(http.MethodPost, "/users", body)
req.Header.Set("Content-Type", "application/json")
var reqBody struct{ Name string `json:"name"` }
json.NewDecoder(r.Body).Decode(&reqBody)req.Header.Set(...) — Composite Types kursidagi map'ga yozish andazasiga o'xshaydi, faqat maxsus Header turi orqali. json.NewDecoder(r.Body).Decode(&reqBody) — JSON Marshaling darsidagi json.Unmarshalning oqim (stream) versiyasi: butun tanani avval []bytega o'qib olish shart emas, Decoder uni to'g'ridan-to'g'ri r.Bodydan o'qiydi.
>_ Exercise
Name string (json:"name") maydonli CreateUserRequest struct'ini yozing. CreateUserHandler(w http.ResponseWriter, r *http.Request) funksiyasini yozing: r.Header.Get("Content-Type") bilan sarlavhani o'qiydi, json.NewDecoder(r.Body).Decode(&req) bilan tanani JSON'dan CreateUserRequestga aylantiradi (xato bo'lsa http.Error bilan 400 qaytaring), so'ngra http.StatusCreated (201) bilan "Content-Type: <turi>, created: <ism>" yozadi.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
POST so'rovlari ma'lumotni tana orqali uzatadi, odatda JSON formatida. json.NewDecoder(r.Body).Decode(...) — so'rov tanasini to'g'ridan-to'g'ri oqim sifatida o'qib, structga aylantirishning samarali usuli. Sarlavhalar (Header) so'rov haqidagi qo'shimcha metama'lumotni tashiydi.
NEXT UP
Unit Testing with Table-Driven Tests
$ go run main.go
Kodingizni ishga tushiring