如何用Alamofire为PUT接口编码[[String: Any]]类型请求体?
解决Alamofire中PUT请求发送数组格式请求体的问题
首先,先明确两个关键点:你的API要求的[[String: Any]]格式是完全符合JSON标准的,然后我们来解决Alamofire的编码适配问题。
一、正确的编码实现方式
Alamofire默认的JSONEncoding是为Parameters(也就是[String: Any])设计的,但要发送数组格式的请求体,有两种常用方案:
方案1:自定义数组专用的ParameterEncoding
你可以实现一个自定义的编码类,专门处理数组类型的参数:
struct ArrayJSONEncoding: ParameterEncoding { func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { var request = try urlRequest.asURLRequest() guard let arrayParameters = parameters?["array"] as? [[String: Any]] else { return request } do { let jsonData = try JSONSerialization.data(withJSONObject: arrayParameters, options: []) request.httpBody = jsonData if request.value(forHTTPHeaderField: "Content-Type") == nil { request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") } } catch { throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) } return request } } // 使用方式 let parameters: Parameters = ["array": yourArrayOfDictionaries] AF.request(yourPUTURL, method: .put, parameters: parameters, encoding: ArrayJSONEncoding()) .responseJSON { response in // 处理响应 }
方案2:手动构建URLRequest并设置请求体
如果觉得自定义编码太麻烦,也可以直接手动序列化数组为Data,然后构建请求:
let yourArray: [[String: Any]] = [/* 你的数组数据 */] var request = URLRequest(url: yourPUTURL) request.httpMethod = "PUT" request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") do { request.httpBody = try JSONSerialization.data(withJSONObject: yourArray, options: []) } catch { print("序列化失败:\(error)") return } AF.request(request) .responseJSON { response in // 处理响应 }
二、关于格式的JSON标准说明
你不用担心这个格式不符合规范——JSON的顶级元素可以是对象或数组,这是在官方规范里明确规定的:
JSON数据是一个序列化的对象或数组。
简单来说,{"key": "value"}(对象)和[{"key": "value"}, {"key": "value"}](数组)都是合法的顶级JSON结构。如果API规范负责人有疑问,你可以告诉他这完全符合JSON官方标准文档中的定义,不存在格式违规的问题。
内容的提问来源于stack exchange,提问作者Brandon M
相关产品推荐
相关产品推荐

