Alamofire额外参数'方法'在通话中 - 使用自定义ParameterEncoding

时间:2017-04-02 07:22:36

标签: swift customization alamofire

我试图在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以捕获字典的值。但是没有理想的。

1 个答案:

答案 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。