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 关注
- 95 浏览
添加回答
举报