HTTP状态码0 - 错误域= NSURLErrorDomain?

115

我正在开发一个iOS项目。

在这个应用程序中,我正在从服务器下载图像。

问题:

当下载图片时,我收到了请求超时的错误提示。根据文档,请求超时的HTTP状态码是408

但是,在我的应用程序中,我收到了HTTP状态码为0的以下错误

错误域=NSURLErrorDomain,代码=-1001,“请求已超时。” UserInfo=0xb9af710 {NSErrorFailingURLStringKey=http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg, NSErrorFailingURLKey=http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg, NSLocalizedDescription=请求已超时, NSUnderlyingError=0x13846870,“请求已超时。”}

在互联网上搜索时,我没有找到有关HTTP状态码0的任何信息。

有人可以解释一下吗?


1
可能也是由于混合内容引起的 https://developer.mozilla.org/zh-CN/docs/Web/Security/Mixed_content - devasghar
这个回答是否解决了你的问题?HTTP状态码为0是否有任何含义? - Michael Freidgeim
13个回答

118

HTTP状态码中并不存在0。你看到的是由你所使用的API/库返回的0。你需要查阅相关文档以了解此情况。


12
IE10有一个奇怪的bug,当收到状态码401或403时,它会将其解释为状态码0。在我看来,状态码0表示错误,因为显然出了问题。 - Gaui
2
答案是错误的。当浏览器无法连接到服务器时,状态码0存在。当您遇到不同的错误,例如504时,这是由于反向代理设置引起的。 - Nickon
答案是正确的。不存在 HTTP 状态码 0。你可能会在 API 的返回值中看到它,但它不会出现在 HTTP 响应消息中。 - Julian Reschke
1
@JulianReschke,这不是一种愿望。devios1的回答显然提供了更详细的信息,现在是时候让点赞数超过这里的了。 - apingaway

102

NSHTTPURLResponse对象中的状态码为0通常意味着没有响应,并且可能由于各种原因而发生。服务器永远不会返回0作为有效的HTTP状态码。

在您的情况下,似乎获取到状态码为0是因为请求超时,0只是该属性的默认值。超时本身可能由于各种原因导致,例如服务器未能及时响应、被防火墙阻止或整个网络连接断开。但通常在后一种情况下,手机足够智能以知道它没有网络连接并立即失败。然而,它仍将以表面上的状态码0失败。

请注意,在状态码为0的情况下,实际错误被捕获在返回的NSError对象中,而不是NSHTTPURLResponse

在我的经验中,HTTP状态408相当不常见。我自己从未遇到过。但显然在客户端需要维护与服务器的活动套接字连接的情况下使用,如果在给定的时间内服务器等待客户端在打开的套接字上发送更多数据,但是没有,则服务器以408状态码结束连接,基本上告诉客户端“你花费的时间太长了”。


2
完美的解释。 - CouchDeveloper

15

状态码“0”可能由三个原因引起:
1)客户端无法连接到服务器
2)客户端在超时期内无法接收响应
3)请求被客户端停止(中止)

但这三个原因并不是标准化的。


1
你有任何相关的资料吗? - rgoliveira
任何源代码都可以用来测试前两个部分,你只需要一个基于Ajax的请求。但是第三个部分发生在取消用户请求时,这可以通过jQuery中的abort函数来完成。 - Hariprasath Yadav

13

iOS SDK中,当API调用超时时,会返回状态码0。


12

响应为空。

HTTP状态码列表显示,大多数情况下的状态码为1xx、2xx、3xx、4xx和5xx。


在您提供的链接中没有关于HTTP状态码0的信息。 - Irfan DANISH

7

根据我的有限经验,可能有以下两种情况会导致响应状态码:0,请记住:可能还有其他情况,但我只知道以下两种:

  • 您的连接可能响应缓慢。
  • 或者后端服务器不可用。

问题在于,状态:0略微通用,并且可能有更多使用案例会触发空响应体。


这是一个API状态,而不是HTTP状态。如果没有HTTP响应,则其中没有HTTP状态码。 - user207421
状态码0并不意味着存在HTTP响应代码,但如果您的服务器不可用,它可能是问题所在。 - Ravi

7
有时,浏览器会用状态设置为0的错误对象响应http错误处理程序,即使您在网络中可以看到404、401、500等错误状态。

如果您的应用程序和API位于不同的域上,则可能会发生这种情况-应用了CORS机制。 根据CORS,对于每个API请求,浏览器发送两个请求:

  1. 预检OPTIONS请求以了解API是否允许实际/来源请求。
  2. 当API允许(OPTIOS请求响应状态为204且正确的Access-Control-Allow-Origin标头)-浏览器发送下一个“实际/来源请求”。

在应用程序中,我们处理“实际/来源请求”的错误响应,如果“预检OPTIONS请求”失败-浏览器不会为http错误处理程序提供正确的HttpError对象。 因此,为了获得正确的http响应状态-请确保获取成功的预检OPTIONS请求响应。


5

HTTP响应0不是标准的HTTP响应。但它表示客户端无法连接到服务器,因此超时发生。


3
我们遇到了错误:
GET http://localhost/pathToWebSite/somePage.aspx 引发了一个 http.status: 0 错误。
该调用是从调用VBS文件的Windows任务中进行的,为了解决问题,我们指向了URL并得到了一个隐私错误:
您的连接不是私密的。攻击者可能会试图窃取您在 localhost 上的信息(例如密码、消息或信用卡)。NET::ERR_CERT_COMMON_NAME_INVALID
自动向 Google 报告可能安全事件的详细信息。隐私政策返回安全性此服务器无法证明它是 localhost;它的安全证书来自 *.ourdomain.com。这可能是由于配置错误或攻击者拦截了您的连接。了解更多。
这是因为我们设置了IIS URL Rewrite规则,强制连接使用https。该规则将http://localhost转到https://localhost,但我们的SSL证书基于外部面向域名而不是localhost,因此报告状态代码0的错误。因此,隐私错误可能是此状态代码0的非常晦涩的原因。
在我们的情况下,解决方案是为localhost添加一个规则例外,并允许http://localhost/pathToWebSite/somePage.aspx使用http。虽然很晦涩,但我明年还会遇到这个问题,现在我可以通过谷歌搜索找到答案。

1

当我的URL以file://开头时,即在没有服务器的情况下从本地文件系统获取文件时,我收到了状态码0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接