我有一个go服务器,它阅读并返回捆绑到tar中的大数据文件。我已经测试过这种方法可以工作,并将tar分段写入,当所有数据加载时,一切正常。
问题是可能会有意外的错误破坏下载。我目前写了一个HTTP错误代码和一个错误消息,但错误消息只是放在流/文件的末尾。有没有一个好的方法来传达导出失败的消息?有没有可能用HTTP状态代码和错误消息来完成这件事?
我正在使用以下curl命令:
curl --insecure https://127.0.0.1/api/export/030e28f3-4ab6-446a-852e-fda0a497ffe2 -o "test.tar"
我是否也必须更改curl命令来检测错误?
2条答案
按热度按时间l0oc07j21#
如果下载已经开始,那么所有的HTTP头都已经发送到HTTP客户端。您不能再重写状态码(它在第一行)。
你唯一能做的就是切断TCP/IP连接。如果你使用
Content-Length
头,客户端会看到传输不完整。如果你使用Transfer-Encoding: chunked
,客户端会看到没有收到块结束标记。在所有情况下,这都会使整个传输无效。你可以 * 尝试 * 处理Range请求和Partial Content响应,并在多个HTTP请求-响应对话框中发送内容。但如果你通过单个HTTP对话框管理大文件传输,你唯一能做的就是中断传输,然后完全重新启动。
通常大文件的分块传输是在HTTP之上的应用层进行管理的。就像在上传的情况下,JavaScript的东西会将文件分块分解,并将其发送回专用的应用服务器,重新构建文件,并在HTTP之上使用专用的协议来请求丢失的部分。这是因为在 * 现实生活中 * 野生HTTP环境中,长时间传输是很难的。另一方面,使用简单的中等大小的HTTP请求几乎可以在任何地方工作。因此,如果您控制客户端和服务器端,您可以在HTTP之上构建自己的对话框,并制作自己的分块传输协议,并具有良好的错误管理。
osh3o9ms2#
如果您控制客户端,则可以添加HTTP响应尾部标头来指示错误,然后在客户端处理它。
有关响应尾标头的更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Trailer