Does an HTTP Status code of 0 have any meaning?
看起来,当您从浏览器中的脚本发出XMLHttpRequest时,如果浏览器设置为脱机工作或拔出了网络电缆,则该请求将以错误和状态= 0来完成。在允许范围内未列出0 HTTP状态代码。
状态码0是什么意思?对于所有浏览器以及所有HTTP客户端实用程序,这意味着同一件事吗?它是HTTP规范的一部分还是其他协议规范的一部分?这似乎意味着根本无法发出HTTP请求,这可能是因为无法解析服务器地址。
什么错误消息适合显示给用户?"或者您没有连接到互联网,或者网站遇到了问题,或者地址中可能存在键入错误"?
我应该补充一点,当设置为"脱机工作"时,我会在FireFox中看到该行为,而当设置为"脱机工作"时,我不会在Microsoft Internet Explorer中看到该行为。在IE中,用户会看到一个对话框,其中提供了可供选择的联机选项。 FireFox在返回错误之前不会通知用户。
我问这个是为了响应"显示更好的错误消息"的请求。 Internet Explorer的功能很好。它告诉用户是什么导致了问题,并为他们提供了解决问题的选项。为了提供与FireFox等效的UX,我需要推断问题的原因并通知用户。那么,我总共可以从状态0推断出什么?它具有普遍意义还是什么都没告诉我?
简短答案
它不是HTTP响应代码,但W3记录为
它涵盖了可能的情况,其中没有可用的真实HTTP响应代码来报告,这可能是因为您尚未发送请求,显式中止了请求,页面正在卸载或x可能的多个值之一出错的x。
长答案
首先,重申一下:0不是HTTP状态代码。 RFC 7231第6.1节中有完整的列表,其中不包含0,第6节的简介清楚地指出:
The status-code element is a three-digit integer code
哪个不是0。
但是,记录了作为
4.7.1 The status attribute
The
status attribute must return the result of running these steps:If the state is UNSENT or OPENED, return 0.
If the error flag is set, return 0.
Return the HTTP status code.
我们可以更深入地研究规范,找出返回0的条件是什么意思。从http://www.w3.org/TR/XMLHttpRequest/#states:
4.5 States
...
UNSENT (numeric value 0)The object has been constructed.
OPENED (numeric value 1)The
open() method has been successfully invoked. During this state request headers can be set usingsetRequestHeader() and the request can be made using thesend() method....
The error flag indicates some type of network error or fetch termination. It is initially unset.
还需要注意的是,
HEADERS_RECEIVED (numeric value 2)All redirects (if any) have been followed and all HTTP headers of the final response have been received. Several response members of the object are now available.
综上所述,简短的答案是,当没有实际状态代码要返回时,0就是
- 该请求尚未发送,或者
- 请求已发送,但尚未收到响应的标头,或者
- 在文档中列出了已发生的许多可能情况之一,导致设置了"错误标志"。
好的,但是什么错误可以导致设置此神秘的"错误标志"?如果在W3文档中使用CTRL-F表示"错误标志",您将发现它在发送请求时未设置,并且仅作为"终止请求"算法的一部分进行设置。查找所有调用算法的地方,您会发现它发生在以下情况:
-
使用
open() 方法打开(或重新打开)请求 - 该请求是垃圾收集的(例如,离开页面时)
-
使用
abort() 方法中止该请求 -
发生"请求错误",当发生以下情况之一时可能会发生:
-
发生网络错误,如果
- 有一个无限的重定向循环
-
有/有
DNS errors, TLS negotiation failure, or other type of network error
- 该请求是CORS请求,无法共享响应
-
发生中止错误,只有在以下情况下才会发生
The end user cancels the request
不管什么意思。我不知道有什么浏览器可以向用户显示AJAX请求的发生时间,并为他们提供明确取消它们的机会,因此,我认为至少在今天,这是无关紧要的。
-
发生超时错误,这足够合理地意味着
timeout is not 0 and since the request started the amount of milliseconds specified bytimeout has passed
-
就
除了
当通过刷新页面或请求无法访问的URL获得响应之前,取消ajax调用后,状态0就会出现。
此状态未记录,但存在于gadget.io的ajax和makeRequest调用中。
来自文档http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute
表示请求被取消,然后再去任何地方
知道这是一个旧帖子。但是这些问题仍然存在。
以下是我对此主题的一些发现,对此进行了详尽的解释。
根据XMLHttpRequest规范,"状态" 0表示3件事之一:
-
dns名称解析失败(例如,拔出网络插头时)
-
服务器没有应答(也就是无法访问或无响应)
-
由于CORS问题,请求被中止(由用户代理执行堕胎,并在OPTIONS试飞失败之后进行)。
如果想进一步,请深入研究XMLHttpRequest的内部。我建议读取就绪状态更新序列([0,1,2,3,4]是正常序列,[0,1,4]对应于状态0,[0,1,2,4]表示没有内容发送,这可能是错误的,也可能不是)。您可能还希望将侦听器附加到xhr(onreadystatechange,onabort,onerror,ontimeout)以了解详细信息。
根据规格(XHR Living规格):
1 2 3 4 5 | const unsigned short UNSENT = 0; const unsigned short OPENED = 1; const unsigned short HEADERS_RECEIVED = 2; const unsigned short LOADING = 3; const unsigned short DONE = 4; |
从iOS 9开始,您需要在向非安全HTTP Web服务发出请求之前,将"应用程序传输安全设置"添加到info.plist文件中,并允许"允许任意加载"。我在我的一个应用中遇到了这个问题。
是的,一些ajax调用如何终止。原因可能是以下原因。