当前位置: 首页 > 知识库问答 >
问题:

Alamofire请求失败,无响应

南宫凯康
2023-03-14

我在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插入我的授权令牌

我也使用标准路由器的URL刚需转换,编码是通过JSON序列化(字典)或可编码协议(对象)

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_模式和iOS 13,我可以看到它在抱怨请求头和协议。服务器位于Elastic Beanstalk上,因此我一直试图破坏SSL策略,但每次第一个请求都失败。

共有1个答案

宇文智敏
2023-03-14

这变成了一个兔子洞,为了社区的改善,这里是我的发现。

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

为了避开标题值,我最终切换到Nginx代理。因为我的应用程序使用了Laravel,所以我需要纠正漂亮的URL。为此,我找到了这个答案。现在,我的web和移动应用程序似乎都进展顺利。

 类似资料:
  • 我是iOS和Swift的新手,我正在尝试使用AlamoFire3.4.0来做一个web请求。当我的请求成功时,一切都很好。但是,如果我的请求失败,服务器将返回300或更大的状态代码,以及响应体中的一些JSON,其中包含关于请求失败原因的更多信息。例如,我正在与之交谈的API要求对每个请求进行身份验证。如果身份验证由于某种原因失败,我将返回401,响应体中的JSON将为: 我发出此请求的代码如下所示

  • 问题内容: 如何检索请求的响应标头?以下是我提出的要求。 提前致谢! 问题答案: 如果响应为类型,则可以从获取标头。 因此,当您使用Alamofire responseJSON时,可以像这样访问NSHTTPURLResponse属性: 正如苹果文件所说: 包含所有HTTP标头字段的字典,该字段作为服务器响应的一部分收到。通过检查此词典,客户端可以看到HTTP服务器返回的“原始”标头信息。 该词典中

  • 这是我的第一个问题。我对API上的http请求有问题。当我发出请求时,控制台上会显示以下错误: 异常:找不到不同类型'对象'的支持对象'[对象对象]'。NgFor仅支持绑定到Iterable,如Array。 每个文件的内容如下: 靴子ts 应用程序。组成部分ts peli.service.ts peli.ts 以及我从请求中收到的JSON文件(输入-蜘蛛侠): 我不知道问题出在哪里,一切似乎都很好

  • 类项目: hbm文件: 方法如下:

  • 我正在使用带有Robospice(1.4.14)的Revovit(1.6.1)从一些服务中获取数据(响应应该在JSON中)。 在某些情况下,我可能会收到一个HTML错误页面,而不是一个JSON响应。服务器返回一个200状态代码,我不能改变它。在这种情况下,RoboSpice将调用方法。 在那里,我可以获得原始的expetion,但正文是。我是这样得到的: 在研究了reverfit的源代码之后,我发

  • HTTP/1.1 408 REQUEST_TIMEOUT内容-长度:0连接:关闭 已关闭 --------------------------------------------------------------------------------------- 它会导致请求超时。如果我使用curl命令,它是成功的。 请求超时的原因是什么?