2017-04-02 21 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

["data":[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を使用します。

関連する問題