如果在向客户端写入流式响应时发生错误,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
})
}
答案 0 :(得分:2)
我担心您必须在协议上添加协议。 就像使用ajax一样,使用您自己的OK / Continue / Abort状态消息发送简短的json响应。
HTTP中没有任何东西可以解决这个问题(客户端到服务器的100-Continue有一些东西,严重影响并且没有为服务器到客户端),除非可能发送分块响应并且从不发送最后一个块(所以整个响应将超时)。
使用ajax解决方案,您也可以在结束前开始显示结果。
在HTTp上管理你自己的块通常是最简单的解决方案,例如参见文件上传者,他们将使用js分割文件并重新组合文件服务器端。
尝试管理反向代理或代理可能在您的大HTTP消息通信中注入的所有混乱(想想直到最近Nginx反向代理不会传输响应,并使用缓冲消息)。