我有一个在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)
它对我有用.希望可以帮助别人.
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 端点。
| 归档时间: |
|
| 查看次数: |
8579 次 |
| 最近记录: |