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


94

我正在开发一个iOS项目。

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

问题:

下载图像时,我收到请求超时。根据文档,请求超时的HTTP状态代码为408

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

错误域= 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 = 0xx13846870“请求超时。”}

在搜索过程中,通过互联网,我没有找到有关HTTP状态码0的信息。

谁能向我解释一下?



Answers:


97

没有HTTP状态代码0。您看到的是您所使用的API /库返回的0。您将需要检查文档。


7
IE10有一个怪异的错误,当收到状态码401或403时,它会将其解释为状态码0。在我看来,状态码0是一个错误,因为显然有问题。
盖伊2015年

5
闸道超时将在您的HTTP错误回调中收到0状态,angulartutorial.net
2017/

答案是错误的。当浏览器无法连接到服务器时,状态代码0存在。当您遇到不同的错误(例如504)时,这是由反向代理设置引起的。
尼克

答案是正确的。没有HTTP状态代码0。您可能会看到它是API的返回值,但不会在HTTP响应消息中出现。
朱利安·雷施克

75

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

在您的情况下,由于请求超时,您似乎会得到状态码0,而0只是该属性的默认值。超时本身可能是由于多种原因,例如服务器根本无法及时响应,被防火墙阻止或整个网络连接中断。通常,在后者的情况下,尽管手机足够智能,可以知道它没有网络连接,并且会立即发生故障。但是,它仍然会失败,并且表面状态码为0。

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

408以我的经验,HTTP状态非常罕见。我自己从未遇到过。但是,显然,它用于客户端需要维持与服务器的活动套接字连接,并且服务器正在等待客户端通过打开的套接字发送更多数据的情况,但是它没有在给定的时间内发送数据。服务器以408状态码结束连接,从本质上告诉客户端“您花了太长时间”。


1
完美的解释。
CouchDeveloper



5

根据我有限的经验status code: 0,请记住以下两种情况可能会引起响应,请牢记;他们可能更多,但我知道那两个:

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

事实是,status: 0它有点通用,它们可能是触发空响应主体的更多用例。


这是API状态,而不是HTTP状态。如果没有HTTP响应,则其中没有HTTP状态代码。
罗恩侯爵

状态代码0并不意味着存在HTTP响应代码,但是如果您的服务器不可用,则可能是问题所在。
拉维

5

由于以下三个原因, 可能会出现状态代码“ 0”:
1)客户端无法连接到服务器
2)客户端无法在超时时间内 接收到响应
3)客户端“停止(中止)了请求

但是这三个原因尚未标准化


你有任何资料吗?
rgoliveira

任何源代码都适用于测试前两点,您只需要基于ajax的请求。但是第三个正在取消用户请求,这可以通过jquery中的中止功能来完成。
Hariprasath Yadav


2

我们得到了错误:

GET http://localhost/pathToWebSite/somePage.aspx引发了http.status:0错误

该调用是从调用VBS文件的Windows任务进行的,因此要解决此问题,请在浏览器中指向url,然后会收到“隐私错误”:

你的连接不是私人的

攻击者可能试图从本地主机窃取您的信息(例如,密码,消息或信用卡)。NET :: ERR_CERT_COMMON_NAME_INVALID

自动向Google报告可能的安全事件的详细信息。隐私权政策返回安全性此服务器无法证明它是本地主机;请参阅安全性指南。其安全证书来自* .ourdomain.com。这可能是由于配置错误或攻击者拦截了您的连接引起的。学到更多。

这是因为我们有一个IIS URL重写规则集来强制连接使用https。该规则将http:// localhost转移到https:// localhost,但是我们的SSL证书基于面向外部的域名而不是localhost,因此该错误报告为状态码0。因此,隐私错误可能是一个非常晦涩的原因对于此状态代码0。

在我们的案例中,解决方案是为localhost的规则添加例外,并允许http://localhost/pathToWebSite/somePage.aspx使用http。晦涩,是的,但是明年我会遇到这种情况,现在我会在Google搜索中找到答案。


2

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

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

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

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




-1

在闸道超时时,错误回调的状态将为零。

.error( function( data,status,headers,config){
    console.log(status) 
 }

HTTP状态码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.