2016-03-24 3 views
4

ich eine Datenstruktur, die wie folgt in JSON aussieht:Alamofire: Senden JSON mit Array von Wörterbücher

[{ 
    "value": "1", 
    "optionId": "be69fa23-6eca-4e1b-8c78-c01daaa43c88" 
}, { 
    "value": "0", 
    "optionId": "f75da6a9-a34c-4ff6-8070-0d27792073df" 
}] 

Im Grunde ist es eine Reihe von Wörterbüchern. Ich würde lieber die Alamofire-Standardmethoden verwenden und möchte die Anforderung nicht manuell erstellen. Gibt es eine Möglichkeit, Alamofire meine Parameter zu geben und Alamofire erledigt den Rest?

Wenn ich alles von Hand erstelle, bekomme ich einen Fehler vom Server, dass die Sendedaten nicht korrekt wären.

var parameters = [[String:AnyObject]]() 

    for votingOption in votingOptions{ 

     let type = votingOption.votingHeaders.first?.type 

     let parameter = ["optionId":votingOption.optionID, 
      "value": votingOption.votingBoolValue 
     ] 
     parameters.append(parameter) 
    } 

    let jsonData = try! NSJSONSerialization.dataWithJSONObject(parameters, options: []) 
    let json = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: .AllowFragments) 


    if let url = NSURL(string:"myprivateurl"){ 
     let request = NSMutableURLRequest(URL: url) 
     request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
     request.HTTPMethod = Method.POST.rawValue 
     request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(parameters, options: []) 

     AlamofireManager.Configured.request(request) 
      .responseJSON { response in 
      //Handle result  
     } 
    } 
+0

Irgendwelche Updates zu diesem Problem? – Randy

Antwort

-2

Sie können etwas tun:

Alamofire.request(.POST, urlPath, parameters: params).responseJSON{ request, response, data in 
    //YOUR_CODE 
} 

Wo parameters ist [String:AnyObject] und ja Alamofire kümmert sich um den Rest.

Da es sieht aus wie Sie einen Manager verwenden, können Sie das tun

YOUR_ALAMOFIRE_MANAGER.request(.POST, url, parameters: params).responseJSON{ request, response, JSON in 
    //enter code here 
} 

Hier ist der Quellcode:

public func request(
    method: Method, 
    _ URLString: URLStringConvertible, 
    parameters: [String: AnyObject]? = nil, 
    encoding: ParameterEncoding = .URL, 
    headers: [String: String]? = nil) 
    -> Request 
{ 
    let mutableURLRequest = URLRequest(method, URLString, headers: headers) 
    let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0 
    return request(encodedURLRequest) 
} 

EDIT:

Da Ihre Daten derzeit [[String:AnyObject]] Sie muss es ändern, so ist es in der Form [String:AnyObject]. Eine Möglichkeit, dies zu tun, ist ["data":[[String:AnyObject]]]. Wahrscheinlich müssen Sie Ihren API-Endpunkt jedoch ändern.

+0

Parameter nimmt [String: AnyObject] aber ich habe [[String: AnyObject]]. Oder sehen Sie eine Möglichkeit, wenn Sie sich meinen JSON anschauen? – netshark1000

+0

Ich habe das nicht gesehen, Sie könnten immer etwas wie '[" data ": [[String: AnyObject]]]' 'machen. – boidkan

+0

Sie müssen Ihre Daten so modellieren, dass sie [String: AnyObject] widerspiegeln. Sollte nicht zu schwer sein. – boidkan

-1

Sie können die Parametercodierung für die JSON POST-Anforderung bereitstellen und die Daten als JSON im Anfragetext senden.

Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters, encoding: .JSON) 

Dies ist in der ReadMe-Datei von Alamofire Github beschrieben - https://github.com/Alamofire/Alamofire#post-request-with-json-encoded-parameters

let parameters = [ 
    "foo": [1,2,3], 
    "bar": [ 
     "baz": "qux" 
    ] 
] 

Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters, encoding: .JSON) 
// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} 
+0

Parameter dauert [String: AnyObject], aber ich habe [[String: AnyObject]]. Oder sehen Sie eine Möglichkeit, wenn Sie sich meinen JSON anschauen? – netshark1000

6

ich das gleiche Problem haben und auf diese Weise gelöst:

ich eine neue Struktur geschaffen, um die ParameterEncoding Protokolls Alamofire Umsetzung :

struct JSONArrayEncoding: ParameterEncoding { 
    private let array: [Parameters] 

    init(array: [Parameters]) { 
     self.array = array 
    } 

    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { 
     var urlRequest = try urlRequest.asURLRequest() 

     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 kann ich das tun:

let parameters : [Parameters] = bodies.map({ $0.bodyDictionary() }) 
Alamofire.request(url, method: .post, encoding: JSONArrayEncoding(array: parameters), headers: headers).responseArray { ... } 

Es funktionierte für mich. Hoffnung kann jemand anderem helfen.

+0

Was sind Körper hier?Könnten Sie bitte etwas über die Parameter erklären? – Ishika

+0

{ "my_profileid": "" "Länder": [{"country_full_name": "", "id": ""}], "languages": [{"language_full_name" : "", "id": ""}], "Bereiche": [{"area_full_name": "", "id": ""}], "profile_types": [{"profile_type_full_name": "", "profile_type_short_name": "", "id": ""}], "profile_levels": [{"profile_level_full_name": "", "id": ""}] Dies ist mein Anfrageparameter, aber es ist gibt mir einen Fehler – Ishika