如果在向客户端写入流响应时发生错误,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 })}
1 回答
慕虎7371278
TA贡献1802条经验 获得超4个赞
恐怕您必须在协议上添加协议。就像使用 ajax 一样,发送带有您自己的 OK/Continue/Abort 状态消息的简短 json 响应。
HTTP 中没有什么可以处理的(客户端到服务器中的 100-Continue 有一些东西,实现得很糟糕,不是为服务器到客户端制作的),除非可能发送分块响应并且从不发送最后一个块(所以整个响应将暂停)。
使用 ajax 解决方案,您还可以在结束之前开始显示结果。
在 HTTp 上管理您自己的块通常是最简单的解决方案,例如文件上传器,他们将使用 js 将文件分成块并重新组合文件服务器端。
尝试管理反向代理或代理可能在您的大 HTTP 消息通信中注入的所有混乱(想想直到最近 Nginx 反向代理不会流响应,并使用缓冲消息)。
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报
0/150
提交
取消