[json] Go를 사용하여 JSON 응답을 제공하는 방법은 무엇입니까?
질문 : 현재 다음 func Index
과 같이 내 응답을 인쇄하고 fmt.Fprintf(w, string(response))
있지만 요청에서 JSON을 제대로 보내면보기에서 사용할 수 있습니까?
package main
import (
"fmt"
"github.com/julienschmidt/httprouter"
"net/http"
"log"
"encoding/json"
)
type Payload struct {
Stuff Data
}
type Data struct {
Fruit Fruits
Veggies Vegetables
}
type Fruits map[string]int
type Vegetables map[string]int
func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
response, err := getJsonResponse();
if err != nil {
panic(err)
}
fmt.Fprintf(w, string(response))
}
func main() {
router := httprouter.New()
router.GET("/", Index)
log.Fatal(http.ListenAndServe(":8080", router))
}
func getJsonResponse()([]byte, error) {
fruits := make(map[string]int)
fruits["Apples"] = 25
fruits["Oranges"] = 10
vegetables := make(map[string]int)
vegetables["Carrats"] = 10
vegetables["Beets"] = 0
d := Data{fruits, vegetables}
p := Payload{d}
return json.MarshalIndent(p, "", " ")
}
답변
클라이언트가 json을 기대할 수 있도록 콘텐츠 유형 헤더를 설정할 수 있습니다.
w.Header().Set("Content-Type", "application/json")
구조체를 json으로 마샬링하는 또 다른 방법은 다음을 사용하여 인코더를 빌드하는 것입니다. http.ResponseWriter
// get a payload p := Payload{d}
json.NewEncoder(w).Encode(p)
답변
다른 사용자 Content-Type
는 plain/text
인코딩 할 때가 있다고 언급합니다 . Content-Type
먼저 w.Header().Set
HTTP 응답 코드 를 설정해야 합니다 w.WriteHeader
.
당신이 호출 할 경우 w.WriteHeader
먼저 전화를 w.Header().Set
당신이 얻을 것이다 후 plain/text
.
예제 핸들러는 다음과 같습니다.
func SomeHandler(w http.ResponseWriter, r *http.Request) {
data := SomeStruct{}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(data)
}
답변
getJsonResponse
함수 에서 이와 같은 일을 할 수 있습니다.
jData, err := json.Marshal(Data)
if err != nil {
// handle error
}
w.Header().Set("Content-Type", "application/json")
w.Write(jData)
답변
gobuffalo.io 프레임 워크에서 다음과 같이 작동하도록했습니다.
// say we are in some resource Show action
// some code is omitted
user := &models.User{}
if c.Request().Header.Get("Content-type") == "application/json" {
return c.Render(200, r.JSON(user))
} else {
// Make user available inside the html template
c.Set("user", user)
return c.Render(200, r.HTML("users/show.html"))
}
그런 다음 해당 리소스에 대한 JSON 응답을 얻으려면 “Content-type”을 “application / json”으로 설정해야하며 작동합니다.
Rails가 여러 응답 유형을 처리하는 더 편리한 방법을 가지고 있다고 생각합니다. 지금까지 gobuffalo에서 동일한 것을 보지 못했습니다.