CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "net/http/httptest"
    "strings"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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ü

Soru
w.Header().Set("Content-Type", "____")
json.NewEncoder(w).Encode(v)
Cevap
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

Orta seviye bölümündeki tüm dersler