2017-04-02 2 views
0

Ich versuche, ein Array von Objekten in JsonSerialization und Gzip hochzuladen. Ich habe eine Struktur geschrieben wie in GitHub beschrieben.Alamofire Extra Argument 'Methode' im Aufruf - mit benutzerdefinierten 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! 
} 

}

dann in der Anfrage

request = customAlamofireManager.request(
     ServerURL , 
     method: .post, 
     parameters: [objects], 
     encoding: JSONDocumentArrayEncoding, 
     headers: headers 
    ) 

Fehler "extra Argument Methode in call". Dieses Problem wurde in github1508 here diskutiert, aber ich kann keine Lösung sehen. Da der Parameter als [string: object] definiert ist, kann ein Array nicht übergeben werden. Daher gibt es selbst mit angepasster Struktur für die Codierung keine Möglichkeit, diese Körperdaten weiterzugeben. Ich denke eine Arbeit um vielleicht einen Dummy-Schlüssel zum Array hinzufügen und Server API ändern, um den Wert des Wörterbuchs zu fangen. Aber es gibt kein Ideal.

+0

Nur versucht, einen zufälligen Schlüssel zum Array hinzuzufügen, um es zu einem Wörterbuch wie ["data": [obj]], noch immer gleichen Fehler. Weil die Struktur ein Array erwartet, kein Wörterbuch. Also wird es nicht funktionieren. – Ning

Antwort

0

meine eigene Frage Antwort: eine Arbeit um, um ein Standard-Anforderungsmethode ohne Verwendung:

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 { 
... 
} 

} Anstelle von Anfrage (url, Verfahren, Parameter, Codierung, headers), machen den encodedRequest manuell zuerst und dann den Datenantrag von init alamofire verwenden.

Verwandte Themen