2017-04-02 58 views
0

我试图上传jsonSerialization和gzip中的对象数组。我写了一个结构,如github中所述。Alamofire调用中的额外参数“方法” - 自定义ParameterEncoding

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 
    ) 

错误是 “在呼叫额外的参数的方法”。这个问题已在github1508 here中讨论过但我看不到解决方案。由于该参数被定义为[string:object],因此无法传入数组。因此,即使使用自定义的编码结构,也无法传递此正文数据。我正在考虑周围的工作可能会添加一个虚拟键到数组并修改服务器API以捕获字典的价值。但是没有理想。

+0

只是试图添加一个随机密钥到数组使其成为一个字典,如[“数据”:[obj]],仍然是相同的错误。因为结构需要一个数组,而不是字典。所以它不会工作。 – Ning

回答

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。