我试图在jsonSerialization和gzip中上传一组对象。我写了一个结构,如github中所述。
struct JSONDocumentArrayEncoding: ParameterEncoding {
private let array: [Document]
init(array:[Document]) {
self.array = array
}
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var urlRequest = urlRequest.urlRequest
let data = try JSONSerialization.data(withJSONObject: array, options: [])
if urlRequest!.value(forHTTPHeaderField: "Content-Type") == nil {
urlRequest!.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
urlRequest!.httpBody = data
return urlRequest!
}
}
然后在请求中
request = customAlamofireManager.request(
ServerURL ,
method: .post,
parameters: [objects],
encoding: JSONDocumentArrayEncoding,
headers: headers
)
错误是#34;呼叫中的额外参数方法"。这个问题在github1508 here中讨论过但我看不到解决方案。由于参数定义为[string:object],因此无法传入数组。因此,即使使用自定义的编码结构,也无法传递此正文数据。我想解决方法可能是在数组中添加一个虚拟密钥并修改服务器api以捕获字典的值。但是没有理想的。
答案 0 :(得分:0)
回答我自己的问题:在不使用默认请求方法的情况下查找解决方法:
func uploadBatchDocumentsWithDocs(_ documents: [Any]) {
let headers = NetworkManager.sharedInstance.headers
var urlRequest = URLRequest(url: URL(string: (ServerURL + Api))!)
urlRequest.httpMethod = "post"
urlRequest.allHTTPHeaderFields = headers
let jsonArrayencoding = JSONDocumentArrayEncoding(array: documents)
let jsonAryEncodedRequest = try? jsonArrayencoding.encode(urlRequest, with: nil)
var request: Alamofire.DataRequest? = customAlamofireManager.request(jsonAryEncodedRequest!)
request?.validate{request, response, data in
return .success
}
.responseJSON {
...
}
} 而不是使用请求(url,方法,参数,编码,标题),首先手动编写encodedRequest,然后使用init alamofire的datarequest。