Ответ в формате JSON в Go
Ответ можно собрать структурой и отдать с нужным заголовком типа. Клиент тогда видит текст в формате JSON и может разобрать его тем же пакетом, что уже проходили для байт в памяти.
Перед записью тела ставят заголовок
Content-Type со значением
application/json. Кодировщик
из пакета JSON пишет прямо в объект
ответа и возвращает ошибку сборки.
Вернем пользователя с именем и возрастом:
package main
import (
"encoding/json"
"log"
"net/http"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /user", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
u := User{Name: "ann", Age: 20}
if err := json.NewEncoder(w).Encode(&u); err != nil {
http.Error(w, "encode", http.StatusInternalServerError)
return
}
})
if err := http.ListenAndServe("127.0.0.1:8080", mux); err != nil {
log.Fatal(err)
}
}
В теле ответа текст с ключами name
и age. Кодировщик добавляет
перевод строки в конце, это нормально
для учебного вывода.
Карту с строковыми ключами отдают так же, если не хотят заводить тип:
package main
import (
"encoding/json"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /status", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
m := map[string]string{"state": "ok"}
if err := json.NewEncoder(w).Encode(m); err != nil {
http.Error(w, "encode", http.StatusInternalServerError)
return
}
})
if err := http.ListenAndServe("127.0.0.1:8080", mux); err != nil {
log.Fatal(err)
}
}
Дана структура:
type Point struct {
X int `json:"x"`
Y int `json:"y"`
}
Напишите полный main.go с маршрутом
просмотра /point, который отдает
JSON для точки 3 и 4
с заголовком типа JSON.
Дан следующий код:
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(struct{ Ok bool }{Ok: true})
Скажите, какой заголовок увидит клиент и какой ключ будет в теле ответа.
Дан обработчик, который сначала вызывает кодировщик JSON, а затем ставит заголовок типа. Скажите, успеет ли клиент увидеть правильный тип содержимого.