我正在尝试使用.get方法使用Alamofire调用服务。 请求没有任何特殊的参数,只有Authorization标头。
我在这里有点生气,因为当我使用相同的URL和授权令牌在postman上运行它时请求工作正常,但是当我用Alamofire运行我的应用程序代码时它会返回此错误:
错误域= NSPOSIXErrorDomain代码= 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
}
}
任何想法都会受到赞赏或指出我正确的方向:)
答案 0 :(得分:7)
我在基础类URLSession
的Cocoa中得到了与你完全相同的错误。经过几个小时的调试,问题出在HTTP请求体中。
您应该尝试转储HTTP请求/响应正文以查看是否存在某些格式错误的字段。例如,Content-Length
和Content-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
,但如果您确定响应正文类型,则不需要它。
答案 1 :(得分:5)
我在Apache发送upgrade
标头时遇到此错误。以下是Apache关于该问题的bugzilla讨论的链接。
通过将Header unset Upgrade
添加到Apache中的主机配置来修复它。
答案 2 :(得分:3)
这对我来说至少是整整一天都很棘手。我在最后弄清楚如何解决它,这是服务器的HTTP协议版本问题。
我们使用IIS连接到开发API,默认情况下,如果我正确记得10以上,如果客户端和服务器都支持HTTP 2.0,则使用HTTP 2.0。此外,我们的服务器使用SSL证书进行开发API,因此我认为这是与HTTP 2.0相结合的主要问题。禁用在开发API中为IIS使用HTTP 2.0可以解决此问题。
所以我的建议是尝试监视传入的请求以查看在服务器中使用该请求的协议类型,您可以使用 Charles 或任何其他HTTP监视工具来执行此操作。
我希望这可以帮助其他人解决同样的问题。
答案 3 :(得分:2)
尝试在您的请求中使用参数:nil替换此参数:[:]。奇怪的是它解决了这个问题。
答案 4 :(得分:2)
我使用过apache服务器,通过在标题中添加Upgrade
键来解决问题。
示例:
let headers = ["Upgrade":"h2,h2c", "Content-Type":"application/json"]
希望对其他人有帮助。
答案 5 :(得分:1)
将["Content-Type": "application/json"
]添加到标题中有帮助。
答案 6 :(得分:1)
我有同样的问题通过将授权费用值替换为nil代替""
来修复它[request setValue: @"" forHTTPHeaderField:@"Authorization"];
将其更改为此
[request setValue: nil forHTTPHeaderField:@"Authorization"];
答案 7 :(得分:1)
在某些情况下,您必须添加一个条目以忽略包含“ Upgrade”的标头,如以下解决方案所示:https://forum.directadmin.com/showthread.php?t=55803 和 https://serverfault.com/questions/937253/https-doesnt-work-with-safari
在某些情况下,仅需要在htaccess中添加一行
{{1}}
希望我能帮助您
答案 8 :(得分:0)
在我的情况下,测试网络中有几个F5平衡器。其中一个F5服务器错误地验证了请求,使得包含@或/的json对象被认为是格式错误的。这个问题很难被发现,因为很多时候这个问题对我有用,但很少次没有 - 完全根据我的客户端应用程序正在与之通信的特定配置错误的F5服务器。
答案 9 :(得分:0)
如果您使用某种嗅探器,请尝试将其关闭。 对我来说,运行 Charles 是此错误的原因。我正在将文件上传到服务器,并且仅适用于小文件(几个kb)。 500kb文件导致我在Charles中出现“ EOF”失败,并导致您在xCode中出错。关闭Charles可以上传任何大文件。我还没有找到确切的原因。 Charles通过Web处理相同的查询效果很好,但不适用于iOS。
答案 10 :(得分:0)
当我使用 Google Places API 时遇到了这个问题,然后我发现问题出在HTTP正文中,我将HTTP正文设置为nil,问题就解决了
答案 11 :(得分:0)
花费数小时后,该修复程序在标题中添加了“升级”字段。
let headerFields = ["Upgrade":"h2,h2c","Content-Type":"application/x-www-form-urlencoded"]