【发布时间】:2016-02-24 19:01:36
【问题描述】:
如果在向客户端写入流式响应时发生错误,http 服务器的正确行为是什么。客户端已经收到状态码 200,所以它认为没问题。服务器仍然可以终止连接以通知客户端发生错误还是应该在响应正文中返回某些内容?
我正在从数据库流式传输许多行,因此我不希望在发送到客户端之前进行批处理。
golang 中的一个例子:
func streamingHandler(s ServerSettings, db *sql.DB) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json-seq")
w.Header().Set("Access-Control-Allow-Origin", "*")
_, err = fmt.Fprintf(w, "\u001E[1,2,3]\n", item)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
_, err = fmt.Fprintf(w, "\u001E[1,2,3]\n", item)
// the error could be from Fprintf or a database error.
// What happens if error occurs here.. the client has already received header and some response
if err != nil {
http.Error(w, err.Error(), 500)
return
}
...
etc
})
}
【问题讨论】:
-
我不这么认为。您不能再发送任何标头。如果您确实预先指定了 Content-Length,那么至少应该清楚地表明响应是不完整的。否则客户端必须从内容本身推断。