为了账号安全,请及时绑定邮箱和手机立即绑定

在golang http中发送部分响应后通知http客户端错误的正确方法

在golang http中发送部分响应后通知http客户端错误的正确方法

Go
弑天下 2021-12-20 09:43:44
如果在向客户端写入流响应时发生错误,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 反向代理不会流响应,并使用缓冲消息)。


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信