我有一个HTTP服务器,它返回大型主体以响应POST请求(它是一个SOAP服务器)。这些机构通过分块“流式传输”。如果我在流式传输响应中途遇到错误,如何向客户端报告该错误并仍然保持连接打开?该实现使用专有的HTTP / SOAP堆栈,因此我对HTTP协议级别的答案感兴趣。
答案 0 :(得分:2)
一旦服务器将状态行(响应的第一行)发送到客户端,您就不能再更改响应的状态代码。许多服务器通过在内部缓冲它直到缓冲区已满来延迟发送响应。当缓冲区填满时,您仍然可以改变对响应的看法。
如果您的客户端可以访问响应头,您可以使用chunked编码允许服务器在分块编码的主体之后添加带有头的预告片这一事实。因此,您的服务器遇到错误后,可以优雅地停止发送正文,然后发送预设,将某些标头设置为某个值。然后,您的客户端会将此标头的存在解释为发生错误的迹象。
答案 1 :(得分:2)
另请注意,分块响应可以包含"footers",就像HTTP标头一样。失败后,您可以发送一个页脚,如:
X-RealStatus: 500 Some bad stuff happened
或者如果你成功了:
X-RealStatus: 200 OK
答案 2 :(得分:0)
只要response.iscommitted()返回false,您就可以更改状态代码。 (在Java中使用HttpServletResponse,我确定在其他语言中存在等价物)