1 回答

TA貢獻1775條經驗 獲得超8個贊
您的最后一段代碼包含許多錯誤。相關部分(沒有無用和混淆的 Printlns)是:
p, err := page.PSave(db)
if err != nil {
if err := jsonapi.MarshalPayload(w, p); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
w.Header().Set("Content-Type", jsonapi.MediaType)
w.WriteHeader(http.StatusCreated)
主要的錯誤是json.MarshalPayload它只在err != nil. 換句話說,只有在保存失敗時才序列化該頁面。
第二個錯誤是jsonapi.MarshalPayload將Write調用http.ResponseWriter. 這會將所有后續調用 Header().Set變成WriteHeader空操作。
更正確的代碼看起來像這樣。
// 1. Save the page in the database, bail on error
p, err := page.PSave(db)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 2. Marshal the page into an intermediate buffer, bail on error
var buf bytes.Buffer
if err := jsonapi.MarshalPayload(&buf, p); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 3. Write the entire response; failures to write the intermediate buffer
// cannot be communicated over HTTP
w.Header().Set("Content-Type", jsonapi.MediaType)
w.WriteHeader(http.StatusCreated)
if _, err := buf.WriteTo(w); err != nil {
log.Printf("failed to write response: %v", err)
return
}
- 1 回答
- 0 關注
- 123 瀏覽
添加回答
舉報