Alamofire:使用字典数组发送JSON

net*_*000 5 swift alamofire

我有一个在JSON中看起来像这样的数据结构:

[{
    "value": "1",
    "optionId": "be69fa23-6eca-4e1b-8c78-c01daaa43c88"
}, {
    "value": "0",
    "optionId": "f75da6a9-a34c-4ff6-8070-0d27792073df"
}]
Run Code Online (Sandbox Code Playgroud)

基本上它是一系列字典.我宁愿使用默认的Alamofire方法,也不想手动构建请求.有没有办法给Alamofire我的参数和Alamofire完成剩下的工作?

如果我手动创建所有内容,我会从服务器收到错误,发送数据不正确.

    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     
        }
    }
Run Code Online (Sandbox Code Playgroud)

jor*_*umi 12

我有同样的问题并以这种方式解决:

我创建了一个实现Alamofire的ParameterEncoding协议的新结构:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以这样做:

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

它对我有用.希望可以帮助别人.

  • 这里的尸体是什么?您能详细解释一下参数吗 (2认同)

boi*_*kan -2

你可以这样做:

Alamofire.request(.POST, urlPath, parameters: params).responseJSON{ request, response, data in
    //YOUR_CODE
}
Run Code Online (Sandbox Code Playgroud)

在哪里,parameters[String:AnyObject]的,Alamofire 负责剩下的事情。

因为看起来您正在使用管理器,所以您可以这样做

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

这是源代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

编辑:

由于您的数据目前是[[String:AnyObject]]您需要修改的,因此它的形式为[String:AnyObject]。你可以通过这样做来做到这一点的一种方法["data":[[String:AnyObject]]]。不过,您可能需要更改 api 端点。