Go
JSON API
JSON yanıt döndüren bir HTTP endpoint yazmayı öğrenirsin.
JSON API
Bir JSON uç noktası şu adımları izler: isteği doğrula → gövdeyi çöz → işi yap → uygun durum koduyla JSON yanıt yaz. Tekrarı azaltmak için küçük bir yardımcı yazılır:
func jsonYaz(w http.ResponseWriter, kod int, v any) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(kod)
json.NewEncoder(w).Encode(v)
}
Hatalar da JSON olarak dönülürse istemci tek biçimle başa çıkar: {"hata":"ad boş olamaz"}.
Doğrulama ve 201
Ekleme uç noktası örneği:
func ekle(w http.ResponseWriter, r *http.Request) {
var u Urun
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
if err := json.NewDecoder(r.Body).Decode(&u); err != nil {
jsonYaz(w, 400, map[string]string{"hata": "geçersiz JSON"})
return
}
if u.Ad == "" {
jsonYaz(w, 422, map[string]string{"hata": "ad boş olamaz"})
return
}
jsonYaz(w, 201, u)
}
Uygulama Ekleme uç noktası
Yukarıdaki jsonYaz ve ekle fonksiyonlarını yaz (Urun yalnızca Ad string `json:"ad"` içersin). {"ad":"Kalem"} ve {"ad":""} gövdeleriyle iki POST isteği gönderip iki durum kodunu tek satırda yazdır.
Örnek çözümü göster
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"strings"
)
type Urun struct {
Ad string `json:"ad"`
}
func jsonYaz(w http.ResponseWriter, kod int, v any) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(kod)
json.NewEncoder(w).Encode(v)
}
func ekle(w http.ResponseWriter, r *http.Request) {
var u Urun
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
if err := json.NewDecoder(r.Body).Decode(&u); err != nil {
jsonYaz(w, 400, map[string]string{"hata": "geçersiz JSON"})
return
}
if u.Ad == "" {
jsonYaz(w, 422, map[string]string{"hata": "ad boş olamaz"})
return
}
jsonYaz(w, 201, u)
}
func main() {
kod := func(govde string) int {
rec := httptest.NewRecorder()
ekle(rec, httptest.NewRequest("POST", "/urunler", strings.NewReader(govde)))
return rec.Code
}
fmt.Println(kod(`{"ad":"Kalem"}`), kod(`{"ad":""}`))
}
Kendini test et
-
İstek gövdesinin boyutunu sınırlamak için hangisi kullanılır?
- w.WriteHeader(413)
- json.Decoder.Limit
- http.MaxBytesReader(w, r.Body, n)
- r.ContentLength = n
Cevabı göster
http.MaxBytesReader(w, r.Body, n) — MaxBytesReader n bayttan sonra okumayı hatayla keser; aşırı büyük gövdelerle bellek tüketme saldırılarını önler.
-
İçerik türü
w.Header().Set("Content-Type", "____")
json.NewEncoder(w).Encode(v)
Cevabı göster
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(v)
-
Durum ve kod
- Oluşturuldu
- 201
- Bozuk JSON
- 400
- Geçersiz alan
- 422
- Gövde çok büyük
- 413
Sıradaki ders: Özet - net/http