Alamofire 5 执行PUT请求无响应,未触发实际网络请求且无报错
请求无实际流量的排查方向
- 首先最高概率触发该现象的原因:Alamofire的网络请求属于惰性执行的链式任务,如果没有在请求链路末尾挂载响应回调(比如
response()、responseString()、responseDecodable()这类方法),生成的DataRequest对象没有任何强引用持有,会在当前方法执行结束后被ARC直接回收,请求根本不会走到发起网络包的步骤。你现在的代码只写了request和validate两个链式调用,没有挂响应逻辑,刚好完全匹配“代码能走到发起行、无报错、Wireshark看不到流量”的表现。 - 其次是证书固定配置和请求地址不匹配的问题。你当前实际发起的是
http://MyAPI/...的明文HTTP请求,但自定义的ServerTrustManager只给https://MyAPI:5001配置了证书信任评估规则。当你初始化时把allHostsMustBeEvaluated设为true,所有访问的域名都必须匹配到对应的信任规则,当前HTTP请求不在评估列表内,会被Alamofire在客户端内部直接拦截取消,不会走到网络层发包的步骤,也不会弹出明显的运行时错误。对应的调整方式:要么把请求地址替换成和证书配置一致的HTTPS地址,要么把allHostsMustBeEvaluated设为false,允许未配置证书规则的域名正常发起请求。 - 第三点是iOS系统ATS策略的拦截。iOS默认禁止App发起明文HTTP请求,如果你的项目Info.plist没有给
MyAPI域名配置ATS明文访问例外,系统会在本地直接把请求拦截,不会向外发送任何网络包。这类拦截的日志一般只输出到Xcode的系统控制台,不会走App层的回调逻辑,很容易被忽略。 - 最后要确认自定义Session的生命周期:如果持有该
session属性的类实例在请求发起前就被释放回收,Session管理的所有网络请求都会被同步取消,自然不会产生实际流量。一般把网络请求封装类做成全局单例持有,就能规避这类问题。
修正后的可正常执行的请求代码示例:
func requst() { let params: Parameters = [ "nfcId": 1, "date" : "2021-04-12T09:47:12.053Z" ] // 必须挂载响应回调,形成对请求对象的强引用,才会真正触发网络发送 session.request("http://MyAPI/api/Guard/AddGuard", method: .put, parameters: params, headers: nil) .validate(statusCode: 200 ..< 299) .responseString { response in debugPrint("收到请求结果:\(response.result)") } }
内容的提问来源于stack exchange,提问作者GMA64
相关产品推荐
相关产品推荐

