Pertanyaan: Saat ini saya mencetak tanggapan saya func Index
seperti ini. fmt.Fprintf(w, string(response))
Namun, bagaimana saya dapat mengirim JSON dengan benar dalam permintaan sehingga mungkin dikonsumsi oleh tampilan?
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, "", " ")
}
Jawaban:
Anda dapat mengatur header tipe konten Anda sehingga klien tahu untuk mengharapkan json
w.Header().Set("Content-Type", "application/json")
Cara lain untuk menyusun struct ke json adalah dengan membuat encoder menggunakan
http.ResponseWriter
// get a payload p := Payload{d} json.NewEncoder(w).Encode(p)
sumber
w.Header().Set("Content-Type", "application/json")
benar untuk mengatur jenis konten, tidak saat menggunakanjson.NewEncoder
sebaliknya saya mendapatkan hasil txt / polos. Apakah ada orang lain yang mengerti ini. Jawaban dari @poorva bekerja seperti yang diharapkanw.WriteHeader(http.StatusOk)
saya mendapatkan hasil di atas.w.WriteHeader(http.StatusOk)
maka saya mendapatkantext/plain; charset=utf-8
, jika saya tidak mengatur Kode-Status secara eksplisit saya dapatkanapplicaton/json
dan Respons masih memiliki Kode-Status 200.Changing the header map after a call to WriteHeader (or Write) has no effect unless the modified headers are trailers.
w.Header().Set("Content-Type", "application/json")
atasjson.NewEncoder(w).Encode(p)
untuk sayaPengguna lain berkomentar bahwa
Content-Type
isplain/text
saat encoding. Anda harus mengatur yangContent-Type
pertamaw.Header().Set
, kemudian kode respon HTTPw.WriteHeader
.Jika Anda menelepon
w.WriteHeader
dulu kemudian meneleponw.Header().Set
setelah Anda akan mendapatkanplain/text
.Contoh penangan mungkin terlihat seperti ini;
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) }
sumber
Anda dapat melakukan sesuatu seperti ini dalam
getJsonResponse
fungsi Anda -jData, err := json.Marshal(Data) if err != nil { // handle error } w.Header().Set("Content-Type", "application/json") w.Write(jData)
sumber
jData
, mungkin tidak perlu.Data
ukurannya bisa berubah-ubah, bergantung pada data yang sedang disusun, jadi ini bisa menjadi pemborosan memori yang tidak sepele. Setelah menyusun, kami menyalin dari memori keResponseWriter
aliran. Jawaban yang menggunakan json.NewEncoder () dll. Akan menulis JSON yang tersusun langsung keResponseWriter
(ke dalam alirannya ..)Encoder.Encode()
fungsiDalam kerangka gobuffalo.io saya membuatnya berfungsi seperti ini:
// 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")) }
dan kemudian ketika saya ingin mendapatkan respons JSON untuk sumber daya itu, saya harus menyetel "Jenis konten" ke "application / json" dan berhasil.
Saya pikir Rails memiliki cara yang lebih nyaman untuk menangani berbagai jenis respons, sejauh ini saya tidak melihat hal yang sama di gobuffalo.
sumber
Anda dapat menggunakan perender paket ini , saya telah menulis untuk menyelesaikan masalah semacam ini, ini adalah pembungkus untuk melayani JSON, JSONP, XML, HTML dll.
sumber