【问题标题】:NSURLErrorDomain Code=-1001 error when a http post request is sentNSURLErrorDomain Code=-1001 发送 http post 请求时出错
【发布时间】:2015-01-25 09:25:09
【问题描述】:

我正在使用以下代码将图像发布到我的服务器。

@IBAction func postButtonPressed(sender: UIButton) {
    let task = NSURLSession.sharedSession().dataTaskWithRequest(createRequest("http://xx.xx.xxx.xxx/xxxx/"), completionHandler: {
        data, response, error in
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    })
    task.resume()
}

createRequest() 创建所需的 NSURLRequest 对象。

当我使用模拟器时效果很好。问题是当我在 iPhone 上运行我的应用程序时出现以下错误。

Error Domain=NSURLErrorDomain Code=-1001 "The operation couldn’t be completed. (NSURLErrorDomain error -1001.)" UserInfo=0x155e71f0 {NSErrorFailingURLKey=http://xx.xxx.xxx.xxx/xxxx/, NSErrorFailingURLStringKey=http://54.148.156.117/query/, NSUnderlyingError=0x155674d0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1001.)"}

我了解到这个错误是超时错误。重新启动应用程序或手机没有帮助。此外,我尝试从网络浏览器将图像发布到我的服务器,并且没有问题。

什么可能导致这个超时错误?

编辑:当我监控我的网络活动时,我意识到应用程序发送了 10 MB 数据,即使我发送的图像是 0.1 MB。

【问题讨论】:

  • 好吧,我们可能需要查看创建与请求一起发送的数据的代码。如果问题是它比您预期的大 100 倍,那么该代码可能有问题。
  • 我发现当我尝试发布由 UIImagePicker 拍摄的图像时会出现问题。当我发布之前添加到 images.xcassets 文件夹的图像时,它工作正常。你知道为什么会发生这种情况吗?
  • 这些图片有多大?查看创建它们的代码会很有帮助。 (尝试记录您发送到服务器的 NSData 对象的 length 属性...)
  • 哇,uiImagePicker 拍摄的图像是 14 MB,而我的 images.xcassets 文件夹中的图像是 1.5 MB。现在事情越来越清楚了
  • 好的,解决了。服务器最多接受 2 MB。我将缩小我的图像以将图像大小降低到 2 MB 以下。

标签: ios swift nsurlsession nsurlerrordomain


【解决方案1】:

显然我的发布请求出现超时错误,因为我发送的图像服务器会发现太大。我缩小了图像以使服务器可以接受我的图像。

正如this post 所暗示的,NSURLErrorDomain Code=-1001 错误可能是由许多原因引起的,包括:

  • 服务器响应时间限制
  • 关于传入数据的服务器规则
  • 身份验证问题

希望对其他人有所帮助

【讨论】:

  • 如果您可以控制有问题的服务器,检查错误日志会很有帮助 - 通常您会在其中写一些内容以用于超大上传等。
【解决方案2】:

在我的情况下,问题出现在第 3 方库 - FirebasePerformance。 错误报告网址:https://github.com/firebase/firebase-ios-sdk/issues/486

【讨论】:

    【解决方案3】:

    回复晚了,但我最近在运行分配给我的新应用程序时遇到了错误。该应用程序是其中之一,其 URL 域被我公司的系统管理员阻止
    我要求他们允许我访问 URL,之后响应来了并且应用程序运行完美。
    这可能不是每个人的实际解决方案,但一些开发人员可能有受限环境可以通过此获得帮助。

    【讨论】:

    • 在问题下列出不同的可能原因当然会有所帮助。谢谢。
    【解决方案4】:

    好吧,就我而言,只需增加请求的超时时间即可解决问题。

    【讨论】:

    • 这里也一样!在我的情况下,一些 mysql 查询失败但并非总是失败,仅在某些条件下。将超时值加倍允许所有查询完成
    【解决方案5】:

    我修复了使用带有 application/json 的标头并根据请求发送:

    let headers: HTTPHeaders = [
            .accept("application/json")
    ]
    AF.request(url, method: .post, parameters: score, encoder: JSONParameterEncoder.default, headers: headers)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      相关资源
      最近更新 更多