104

我正在开发一个 iOS 项目。

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

问题:

下载图像时,我收到Request Timeout。根据文档,请求超时的 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=0x13846870 "请求超时。"}

在通过 Internet 进行搜索时,我没有找到有关 HTTP 状态代码 0 的信息。

谁能给我解释一下?

4

12 回答 12

106

没有 HTTP 状态代码 0。您看到的是您正在使用的 API/库返回的 0。您将不得不为此检查文档。

于 2013-11-08T15:23:07.490 回答
81

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

在您的情况下,您似乎获得了 0 状态代码,因为请求超时,而 0 只是该属性的默认值。超时本身可能有多种原因,例如服务器没有及时响应、被防火墙阻止或整个网络连接中断。通常在后者的情况下,虽然手机足够聪明,知道它没有网络连接并且会立即失败。但是,它仍然会失败,并显示明显的状态代码 0。

请注意,如果状态码为 0,则在返回的NSError对象中捕获真正的错误,而不是NSHTTPURLResponse.

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

于 2015-04-27T23:08:02.883 回答
11

响应是空的。大多数情况下,代码将统计为 1xx、2xx、3xx、4xx、5xx。

HTTP 状态码列表

于 2013-11-08T11:45:01.863 回答
11

在 iOS SDK 中,当您的 API 调用超时时,您会得到状态 0。

于 2014-10-13T10:48:41.107 回答
6

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

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

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

于 2015-06-17T10:57:35.517 回答
6

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

但这三个原因不规范

于 2018-09-14T08:03:09.813 回答
4

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

于 2018-06-27T03:10:13.653 回答
3

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

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

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

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

于 2019-01-18T06:58:03.423 回答
2

我们得到了错误:

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 重写规则来强制连接使用 https。该规则将http://localhost转移到https://localhost但我们的 SSL 证书是基于外部域名而不是 localhost,因此错误报告为状态代码 0。因此隐私错误可能是一个非常模糊的原因对于此状态码 0。

在我们的例子中,解决方案是向 localhost 的规则添加一个例外,并允许http://localhost/pathToWebSite/somePage.aspx使用 http。晦涩难懂,是的,但明年我会遇到这个问题,现在我会在谷歌搜索中找到我的答案。

于 2017-05-05T23:55:11.677 回答
0

就我而言,CORS。

我曾经在一个 iOS 应用程序中得到过这样的响应。解决方案是标题中缺少Access-Control-Allow-Origin: *

更多:https ://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin

于 2018-08-14T10:32:58.680 回答
0

当我的 URL 以 file:// 开头时,即没有服务器但请求从本地文件系统获取文件时,我得到了状态代码 0。

于 2021-11-01T21:09:52.907 回答
0

如果使用 NSURLConnection,这可能发生在 401 http 响应中。

请参阅NSURLConnection 返回错误而不是响应 401

于 2020-01-21T06:50:24.563 回答