JSON API
- Go kursu
- Orta seviye
- Ders 69/80
- 4 dk
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.
Başlangıç kodu
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"strings"
)
func main() {
// buraya yaz
}Örnek çözüm
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":""}`))
}Beklenen çıktı
201 422
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 İ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) Doğru cevap
- r.ContentLength = n
Açıklama: MaxBytesReader n bayttan sonra okumayı hatayla keser; aşırı büyük gövdelerle bellek tüketme saldırılarını önler.
2 İçerik türü
w.Header().Set("Content-Type", "____")
json.NewEncoder(w).Encode(v)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(v)
Açıklama: application/json, JSON gövdenin standart MIME türüdür.
3 Durum ve kod
| Kavram | Anlamı |
|---|---|
Oluşturuldu |
201 |
Bozuk JSON |
400 |
Geçersiz alan |
422 |
Gövde çok büyük |
413 |