【问题标题】:Error Domain=NSPOSIXErrorDomain Code=100 "Protocol error"错误域=NSPOSIXErrorDomain 代码=100“协议错误”
【发布时间】:2017-05-18 14:32:41
【问题描述】:

我正在尝试使用 .get 方法使用 Alamofire 调用服务。 该请求没有什么特别的,没有参数,只是一个 Authorization 标头。

我有点生气,因为当我使用相同的 URL 和授权令牌在邮递员上运行请求时,请求工作正常,但是当我使用 Alamofire 运行我的应用程序代码时,它返回此错误:

Error Domain=NSPOSIXErrorDomain Code=100 "协议错误" UserInfo={NSErrorPeerAddressKey={length = 16, capacity = 16, bytes = 0x100201bbd83ad0b10000000000000000}, _kCFStreamErrorCodeKey=100, _kCFStreamErrorDomainKey=1}

我正在使用:

Alamofire.request("https://myserverURL", method: .get, parameters: [:], encoding: JSONEncoding.default, headers: ["Authorization":"myToken"])
        .responseJSON {response in 

    guard response.result.error == nil else { 
       //HERE IS WHERE IS GOING IN WITH THE ERROR
    }
}

任何想法都将不胜感激或为我指明正确的方向:)

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    在基础类URLSession 的 Cocoa 中,我遇到了与您完全相同的错误。经过数小时的调试,问题出在 HTTP 请求正文中。

    您真的应该尝试转储 HTTP 请求/响应正文,看看是否有一些格式错误的字段。例如,Content-LengthContent-Type 是对还是错?根据我的经验,如果这些必需的(基本)标头格式不正确,它可能无法工作,具体取决于您的操作系统或其他中间网络接受(例如代理、网关、服务器等)

    我的错是在方法URLRequest.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 中放错了函数参数,导致Content-Type HTTP 字段错误。

    但是,它适用于 macOS 10.12 但不适用于 12.11,因此您应该确保您的 HTTP 请求正文没有格式错误

    希望对你有帮助。


    形成您的示例代码,我猜encoding: JSONEncoding.default 是错误的。由于HTTP GET 方法没有正文,因此严格/不健壮的网络组件会拒绝/不理解它。

    您的目标是在请求标头中设置Accept: application/json,但如果您确定响应正文类型,则不需要。

    【讨论】:

      【解决方案2】:

      Apache 发送upgrade 标头时出现此错误。这是 Apache 的 bugzilla 讨论的链接。

      通过在 Apache 的主机配置中添加 Header unset Upgrade 来修复它。

      【讨论】:

      • 我使用 elb 并在 safari 上出现此错误。我尝试将未设置的升级添加到站点 .htaccess 并且它不起作用,然后我尝试将其放入根 httpd.conf 的 /var/www 部分,一切都很好。
      【解决方案3】:

      ["Content-Type": "application/json"] 添加到标题中会有所帮助。

      【讨论】:

        【解决方案4】:

        至少对我一整天来说,这是一个棘手的问题 ?。我最后弄清楚如何解决它,这是服务器的HTTP协议版本问题。

        我们使用 IIS 连接到开发 API,如果我没记错以上 10,默认情况下 IIS 如果客户端和服务器都支持它,则使用 HTTP 2.0。此外,我们的服务器使用 SSL 证书作为开发 API,所以我认为这是结合 HTTP 2.0 的主要问题。在开发 API 中禁用对 IIS 的 HTTP 2.0 可解决此问题。

        所以我的建议是尝试监控传入的请求,以查看服务器中使用该请求的协议类型,您可以使用 Charles 或任何其他 HTTP 监控工具来完成。

        我希望这可以帮助遇到同样问题的其他人。

        【讨论】:

        • 禁用 HTTP 2.0 对我有用。就我而言,我在 AWS 上使用负载均衡器,使用 TLS 证书进行 HTTPs。
        • Charles 对我来说是这个错误的原因。我正在将文件上传到服务器,它只适用于小文件(几个 kb)。关闭查尔斯允许上传任何大文件。我不知道原因。
        【解决方案5】:

        我使用过 apache 服务器,我已通过在标题中添加 Upgrade 键来解决问题。

        示例:

        let headers = ["Upgrade":"h2,h2c", "Content-Type":"application/json"]
        

        希望对其他人有所帮助。

        【讨论】:

          【解决方案6】:

          尝试在您的请求中用参数:nil 替换此参数:[:]。奇怪的是它解决了这个问题。

          【讨论】:

            【解决方案7】:

            我通过将 Authorization 字段值替换为 nil 而不是 ""

            解决了同样的问题
            [request setValue: @"" forHTTPHeaderField:@"Authorization"];
            

            改成这个

            [request setValue: nil forHTTPHeaderField:@"Authorization"];
            

            【讨论】:

              【解决方案8】:

              如果您使用某种嗅探器,请尝试将其关闭。 运行 Charles 是我出现此错误的原因。我正在将文件上传到服务器,它只适用于小文件(几个 kb)。 500kb 文件导致我在 Charles 中出现“EOF”失败,以及在 xCode 中出现错误。关闭查尔斯允许上传任何大文件。我还没有找到这个的确切原因。 Charles 通过 Web 处理相同的查询效果很好,但在 iOS 上却不行。

              【讨论】:

                【解决方案9】:

                在某些情况下,您必须添加一个条目以忽略包含“升级”的标头,如此解决方案所示:https://forum.directadmin.com/showthread.php?t=55803https://serverfault.com/questions/937253/https-doesnt-work-with-safari

                在某些情况下,只需要在 htaccess 中添加一行

                Header unset Upgrade
                

                希望对你有帮助

                【讨论】:

                  【解决方案10】:

                  在我的例子中,测试网络中有几个 F5 平衡器。其中一台 F5 服务器错误地验证了请求,导致包含 @ 或 / 的 json 对象被视为格式错误。这个问题很难被发现,因为很多时候它对我有用,但有几次不是 - 完全取决于我的客户端应用程序正在与之通信的特定错误配置的 F5 服务器。

                  【讨论】:

                    【解决方案11】:

                    我在使用 Google Places API 时遇到了这个问题,然后我发现问题是 HTTP 正文,我将我的 HTTP 正文设置为 nil 并且问题解决了

                    【讨论】:

                      【解决方案12】:

                      花了几个小时后,修复在标题中添加了“升级”字段。

                      let headerFields = ["Upgrade":"h2,h2c","Content-Type":"application/x-www-form-urlencoded"]
                      

                      【讨论】:

                        【解决方案13】:

                        我刚刚遇到了类似的问题,并通过将身份验证标头从 firebase_token 重命名为 auth 来解决它。

                        我正在构建后端和前端,所以这是一个合理的解决方案。

                        看起来 Nginx 代理正在切断所有未知的标头。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2018-03-08
                          • 2020-05-20
                          • 2023-04-09
                          • 1970-01-01
                          • 2021-05-25
                          • 2021-10-13
                          • 2021-03-06
                          • 1970-01-01
                          相关资源
                          最近更新 更多