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

在golang http中发送部分响应后通知http客户端错误的正确方法,http,go,Http,Go,如果向客户端写入流响应时出错,http服务器的正确行为是什么。客户机已收到状态代码200,因此认为可以。服务器是否仍然可以终止连接以通知客户端发生错误,或者是否应该在响应正文中返回某些内容 我正在从一个数据库流式传输许多行,所以我不希望在发送到客户端之前进行批处理 戈朗的一个例子: func streamingHandler(s ServerSettings, db *sql.DB) http.Handler { return http.HandlerFunc(func(w http.

如果向客户端写入流响应时出错,http服务器的正确行为是什么。客户机已收到状态代码200,因此认为可以。服务器是否仍然可以终止连接以通知客户端发生错误,或者是否应该在响应正文中返回某些内容

我正在从一个数据库流式传输许多行,所以我不希望在发送到客户端之前进行批处理

戈朗的一个例子:

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
    })

}

恐怕你得在协议上加一个协议。 与使用ajax一样,使用自己的OK/Continue/Abort状态消息发送简短的json响应

HTTP中没有什么可以处理的(在客户端到服务器中有100个Continue,实现得很糟糕,不是为服务器到客户端设计的),除非可能发送分块响应,并且从不发送最后一个分块(因此整个响应将超时)

使用ajax解决方案,您还可以在结束之前开始显示结果

在HTTp上管理您自己的区块通常是最简单的解决方案,例如,请参阅文件上载程序,它们将使用js将文件分割成区块,并重新组合文件服务器端


试图管理反向代理或代理可能会在您的大型HTTP消息通信中注入的所有混乱(想想,直到最近,Nginx反向代理才不会流式响应,而是使用缓冲消息)。

我不这么认为。您不能再发送任何标题。如果您确实预先指定了内容长度,那么至少应该清楚地表明响应是不完整的。否则,客户端必须从内容本身推断出这一点。