【问题标题】:Alamofire request fails with nil responseAlamofire 请求失败,响应为零
【发布时间】:2020-11-07 16:37:55
【问题描述】:

我收到许多使用 Alamofire 5.3 失败的请求,其中响应对象本身为 nil,或者错误是“无法解析响应”。我可以从服务器日志中看到所有这些请求都返回有效。

这是我的设置:

API 管理器类:

let config = Alamofire.Session.default.session.configuration
self.session = Alamofire.Session(configuration: config, interceptor: AccessTokenInterceptor())

AccessTokenInterceptor:

class AccessTokenInterceptor: RequestInterceptor {
        func adapt(_ urlRequest: URLRequest, for session: Alamofire.Session, completion: @escaping (AdapterResult<URLRequest>) -> Void) {
            var adaptedRequest = urlRequest
            adaptedRequest.setValue("application/json", forHTTPHeaderField: "Accept")
            adaptedRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")

            if let token = SettingsManager.shared.userToken {
                adaptedRequest.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
            }
            completion(.success(adaptedRequest))
        }
    }

这个拦截器从SettingsManager插入我的身份验证令牌

我还使用 URLRequestConvertible 的标准路由器,其中编码是通过 JSON 序列化(字典)或 Codable 协议(对象)完成的

case .login(let body):
   request.httpBody = try JSONSerialization.data(withJSONObject: body, options: [])
case .register(let object):
   request.httpBody = try JSONEncoder().encode(object)

奇怪的是,我认为我所做的与我使用 Alamofire 的许多其他时间没有什么不同,现在我发出的第一个请求失败但下一个请求成功。如果我删除拦截器,则没有任何变化。

如果我检查传出的标头或正文内容,一切看起来都很正常,但 Alamofire 的响应为零。

更新:通过使用 OS_ACTIVITY_MODE 和 iOS 13,我可以看到它在抱怨请求标头和协议。服务器在 Elastic Beanstalk 上,所以我一直试图弄乱 SSL 策略,但每次第一个请求仍然失败。

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    这变成了一个相当大的兔子洞,所以为了社区改进,这是我发现的。

    在搜索活动日志错误后,我注意到 iOS 抱怨标题类型无效——升级。搜索该值时,我发现 this question 关于删除标题。我了解到 Apache 在 Elastic Beanstalk 上充当代理,但请求中的 HTTP/2 标头混合在一起,而 iOS 不喜欢这样。

    为了摆脱标头值,我最终切换到 Nginx 代理。由于我的应用程序使用 Laravel,因此我需要处理更正漂亮的 URL。为此,我找到了this answer。现在我的网络和移动应用程序似乎都相处得很好。

    【讨论】: