使用Alamofire发送POST请求遇assertionFailure错误求助
我之前在Alamofire 5.x搭配iOS14的环境下也碰到过一模一样的问题,结合你的代码和报错信息,给你几个可行的解决思路:
1. 替换编码方式为JSONEncoding(最推荐)
你当前使用的URLEncoding.default在POST请求的重试场景下,Alamofire有时无法正确重建请求体流,这正是触发断言失败的核心原因。换成JSONEncoding.default就能解决这个问题,因为JSON编码的请求体可以被Alamofire轻松重新序列化生成新的流:
let paramsDict: [String: Any]? = [...] let headersDict: [String: Any]? = [...] AF.request("https://....", method: .post, parameters: paramsDict, encoding: JSONEncoding.default, // 替换为JSON编码 headers: headersDict) .responseJSON { response in // 你的响应处理逻辑 }
如果后端要求表单编码(application/x-www-form-urlencoded),可以用URLEncoding.httpBody替代URLEncoding.default,明确指定把参数编码到请求体中,也能避免重试时的流重建问题:
encoding: URLEncoding.httpBody
2. 禁用自动重试机制
如果必须保留当前的编码方式,你可以关闭Alamofire的默认重试功能,避免触发需要重建请求体的场景。通过自定义Session来实现:
let session = Session(configuration: .default, retrier: nil) // 禁用默认重试器 session.request("https://....", method: .post, parameters: paramsDict, encoding: URLEncoding.default, headers: headersDict) .responseJSON { response in // 你的响应处理逻辑 }
默认情况下Alamofire会自动重试失败的请求,而这个过程需要重新生成请求体流,但普通的参数编码请求没有被标记为可重建的类型,就会触发那个断言。
3. 检查参数和请求头的合法性
确保你的paramsDict里的所有内容都能被当前编码方式正确序列化——比如URLEncoding不支持嵌套字典或者自定义类型,这种情况会导致内部处理出错。另外,建议显式将请求头转换为HTTPHeaders类型,避免隐式转换带来的问题:
let headers = HTTPHeaders(headersDict ?? [:]) // 显式转换为HTTPHeaders类型 AF.request("https://....", method: .post, parameters: paramsDict, encoding: URLEncoding.default, headers: headers) .responseJSON { response in // 你的响应处理逻辑 }
4. 升级到最新版Alamofire
你测试的5.2-5.4版本中这个问题还存在,后续的Alamofire版本(比如5.6及以上)已经修复了这类断言失败的bug,升级到最新稳定版也能解决问题。
内容的提问来源于stack exchange,提问作者Mehrdad

