Fetch 无法识别 102(或任何 1xx)状态码

Fetch does not recognize 102 (or any 1xx) status code

我发现 fetch API 对于 102 或任何小于 [= 的代码总是抛出 TypeErrorERR_EMPTY_REPONSENetworkError when attempting to fetch resource 15=],无论响应正文如何。

我花了很长时间才弄明白。 Fx、Chrome 和 Opera 之间的行为是一致的。我还确认 Postman 正确识别了 102 响应。

我想知道为什么会这样? 1xx 代码应该没问题,不是由 fetch 来决定它是否是一个错误。我找不到任何文件,也找不到任何处于相同情况的人。

这是设计使然吗?还是有办法解决这个问题?我需要 102.

Fetch 规范要求浏览器遵循问题中描述的行为。具体见https://fetch.spec.whatwg.org/#ref-for-concept-response-status%E2%91%A0%E2%91%A8:

Any responses whose status is in the range 100 to 199, inclusive, and is not 101, are to be ignored.

Note: These kind of responses are eventually followed by a "final" response.

只是为了跟进@sideshowbarker 和 Google 员工

  • 1xx 代码被认为是信息性的并且 非最终的 (WebSocket 的 101 除外)
  • 基本上浏览器遵循这个定义,期望更多内容遵循1xx代码
  • 我返回 102 并像其他响应代码一样关闭了连接
  • 浏览器认为这是一个意外结束的连接并抱怨
  • 1xx 应使用其他代码正确完成响应 (> 199)

还有...

  • 浏览器抛出的错误过于简单,无法深入了解实际情况
  • 部分响应(1xx 代码和正文)被忽略,因此不会被浏览器记录,并且 不会 显示在控制台中,使问题进一步复杂化
  • 甚至 999 也适用于浏览器,因为它们不会像 1xx 代码那样被忽略

所以...

  • 不要使用 1xx 除非你想保持一些长时间的 运行 连接或使用 WebSocket
  • 表示"Request received, I'm processing it, come back later"时,不要用102 Processing,而是用202 Accepted表示确认