iOS项目中Alamofire 5.0.0如何修改Transfer-Encoding?
解决Alamofire 5.0.0中Transfer-Encoding默认Chunked的问题
嘿,这个问题我之前碰到过,Alamofire 5确实可以调整Transfer-Encoding的设置,针对你的需求,给你两种实用的解决方案:
方案一:强制使用identity编码
Alamofire默认在无法提前确定请求体长度的时候会用Chunked编码,所以只要我们手动设置Content-Length头,就能让它自动切换为identity编码。具体步骤如下:
- 先把请求参数转换为Data,计算出它的长度
- 在请求头中添加
Content-Length和对应的Content-Type
代码示例:
// 示例参数 let parameters: [String: Any] = ["username": "test", "password": "123456"] // 将参数转为JSON Data guard let jsonData = try? JSONSerialization.data(withJSONObject: parameters) else { print("参数转Data失败") return } // 构建请求头 var customHeaders = HTTPHeaders() customHeaders.add(.contentLength(jsonData.count)) // 设置内容长度 customHeaders.add(.contentType("application/json")) // 设置内容类型 // 发起请求 AF.request("你的服务器接口地址", method: .post, parameters: nil, encoding: JSONEncoding.default, headers: customHeaders) .validate() .responseJSON { response in // 处理你的响应逻辑 switch response.result { case .success(let value): print("请求成功:\(value)") case .failure(let error): print("请求失败:\(error)") } }
这样设置后,请求的Transfer-Encoding就会变成identity,服务器就能正常处理了。
方案二:使用gzip压缩编码
如果你的服务器支持gzip压缩的请求体,也可以把请求体压缩后发送,同时设置对应的请求头:
AF.request("你的服务器接口地址", method: .post, parameters: parameters, encoding: JSONEncoding.default) .modify { urlRequest in // 对请求体进行gzip压缩 guard let originalBody = urlRequest.httpBody, let compressedBody = try? originalBody.gzipped() else { return } // 更新请求体和对应的头信息 urlRequest.httpBody = compressedBody urlRequest.setValue("gzip", forHTTPHeaderField: "Content-Encoding") urlRequest.setValue("\(compressedBody.count)", forHTTPHeaderField: "Content-Length") } .validate() .responseJSON { response in // 处理响应逻辑 }
注意:上面的
gzipped()方法需要你自己实现Data的扩展,或者使用系统的Compression框架来完成压缩逻辑。比如可以这样扩展:
import Compression extension Data { func gzipped() throws -> Data { let bufferSize = 1024 * 64 var compressedData = Data() let filter = try OutputFilter(.compress, using: .zlib) { data in if let data = data { compressedData.append(data) } } try filter.write(self) try filter.finalize() return compressedData } }
这样设置后,请求的Content-Encoding会是gzip,Transfer-Encoding会自动变为identity(因为我们设置了Content-Length),服务器只要支持gzip解压就能正常处理请求。
内容的提问来源于stack exchange,提问作者Tek.ke
相关产品推荐
相关产品推荐

