如何在Alamofire.UploadRequest中记录封装的URLRequest的httpBody?
解决Alamofire 5.6.1 UploadRequest的URLRequest httpBody获取及EventMonitor失效问题
为什么UploadRequest的URLRequest httpBody始终为nil?
Alamofire的UploadRequest(不管是数据、文件还是流上传)不会把上传数据填充到URLRequest的httpBody属性里。这是因为它底层依赖URLSession的uploadTask系列API,这类API会把请求元数据(URLRequest)和上传数据分开传递,而非将数据塞进URLRequest的body中。所以不管你在哪个阶段查看该URLRequest的httpBody,结果都是nil,这是正常的设计逻辑,不是请求没组装完成。
如何获取上传的真实数据?
不用盯着URLRequest的httpBody,直接从UploadRequest本身的属性入手即可:
- 数据上传(
upload(data:)):访问UploadRequest的uploadable属性,它是DataUploadable类型,可直接提取data。 - 文件上传(
upload(fileURL:)):从FileUploadable中拿到fileURL,再读取文件内容。 - 若想在请求发送前捕获数据,可在
Session的performUploadRequest方法后,或通过自定义EventMonitor的对应回调获取。
调试时可关注的Alamofire逻辑层关键点
如果一定要追踪到传给URLSession的最终流程,重点看这几个位置:
UploadRequest的task(for:)方法:这里是创建URLSessionUploadTask的地方,能看到URLRequest和上传数据如何传递给系统API。SessionDelegate的urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)方法:虽不能直接获取完整body,但能监控数据发送进度。RequestAdapter的adapt(_:for:completion:)方法:如果有自定义适配器,这里能看到调整后的最终URLRequest(但依然没有body)。
修复EventMonitor在UploadRequest上不生效的问题
确保你的EventMonitor实现了UploadRequest对应的回调方法,普通Request和UploadRequest的部分事件回调不同:
- 必须实现
request(_:didCreateTask:):Alamofire为UploadRequest创建URLSessionTask时会触发这个方法,可在这里拿到任务和对应请求。 - 实现
requestDidResume(_:):捕获请求开始执行的事件。 - 检查Session初始化时是否正确注入monitor:比如
Session(eventMonitors: [yourMonitor]),要确保monitor实例在Session创建时就传入,Alamofire 5.x不支持创建后动态添加。
简单的EventMonitor实现示例:
class UploadLogger: EventMonitor { func request(_ request: Request, didCreateTask task: URLSessionTask) { guard let uploadTask = task as? URLSessionUploadTask, let uploadRequest = request as? UploadRequest else { return } switch uploadRequest.uploadable { case .data(let data): NSLog("上传数据长度:\(data.count)") // 需要打印内容的话可转成字符串:String(data: data, encoding: .utf8) case .file(let url, _): NSLog("上传文件路径:\(url.path)") default: break } } }
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

