首页 > 解决方案 > 为什么无法下载状态码 4XX 和 5XX 的文件

问题描述

我注意到包括 Firefox 和 Chrome 在内的许多 http 客户端不允许下载带有 4XX 和 5XX 的 http 响应代码的文件。但是,某些客户端允许这些下载,例如 curl 和 wget(带有--content-on-error选项)。

Chrome 和 Firefox 都不提供很好的异常消息。Chrome 失败并显示ERR_INVALID_RESPONSE. Firefox 失败并显示File not found. 如上所述,curly 和 wget 适用于相同的 URL。

我想知道在这种情况下是否有定义正确行为的规范?Chrome和Firefox无法处理请求是否有充分的理由?此外,他们没有提供适当的反馈似乎很奇怪。

我认为在大多数情况下,为失败的请求下载是没有意义的,但在某些情况下它会有所帮助。即使在错误情况下下载文件的一个很好的例子是如果有一个客户端只使用某种第 3 方格式与服务器通信。客户端必须为请求下载生成的文件。如果出现错误,客户端应下载包含错误描述的文件。

例如RFC7231状态

带有错误状态代码的响应消息通常包含一个表示错误条件的有效负载,以便它描述错误状态以及建议的后续步骤来解决它。


4xx(客户端错误)类状态码表明客户端似乎出错了。除了响应 HEAD 请求时,服务器应该发送一个包含错误情况解释的表示,以及它是暂时的还是永久的情况。这些状态码适用于任何请求方法。用户代理应该向用户显示任何包含的表示。

这并不禁止在出现错误的情况下下载。


由于第一个答案而编辑:

我不认为这种行为是用户友好的,我不认为用户友好是这背后的真正原因。例如,向用户显示错误代码和错误消息(在标题中提供)会更有意义。或者至少使用错误消息来指示错误,例如“无法下载文件,因为服务器响应错误”。可能存在只能使用 XML 或任何其他随机文件格式响应的服务器。

最让我烦恼的是,两个浏览器都以不同但任意的错误响应,这些错误并未暗示有关潜在问题的任何信息。

可能这是一个未记录的边缘案例,Chrome 和 Firefox 都只是退回到默认错误,但这似乎不太可能,特别是因为这是一个在 wget 中有特殊标志的边缘案例。

4XX:如果您的客户做错了什么,您为什么要假设文件下载?

如果我们假设 API 有一个以某种文件格式回复的端点,那么可以公平地假设错误消息也以该格式提供,包括提示客户端做错了什么。因此该文件可以帮助修复客户端错误。

标签: google-chromehttpfirefoxcurlwget

解决方案


我不知道该主题的任何规范。该行为应尽可能用户友好。

4XX: 如果您的客户做错了什么,您为什么要假设文件下载?此外,客户端软件在错误使用的情况(例如无效的 url)和处理文件下载之间没有区别。

5xx: 正如您所说,大多数 api 提供错误信息,但您也无法区分下载的情况,例如提供文件的内部错误。

您可以将这种行为与 wget 和 curl 一起使用,但对于以编程方式使用此类 API 而言,它对用户不友好也不实用。

考虑到上述信息,Chrome 和 firefox 只是试图对用户友好。

我希望我能以某种方式回答你的问题或挑战它背后的想法。:)


推荐阅读