我正在尝试使用Alamofire在swift中发布一个帖子请求。
我的json身体看起来像:
{
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List":[
{
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
},
{
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
}
]
}
我正在尝试使用NSDictionnary制作let
list
,如下所示:
[[Time: 30, IdQuestion: 6510, idProposition: 10], [Time: 30, IdQuestion: 8284, idProposition: 10]]
我使用Alamofire的请求如下:
Alamofire.request(.POST, "http://myserver.com", parameters: ["IdQuiz":"102","IdUser":"iOSclient","User":"iOSClient","List":list ], encoding: .JSON)
.response { request, response, data, error in
let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding)
println(dataString)
}
请求有错误,我认为问题出在Dictionary列表中,因为如果我在没有列表的情况下发出请求就可以正常工作了,那么任何想法?
我尝试过建议的解决方案,但我遇到了同样的问题:
let json = ["List":list,"IdQuiz":"102","IdUser":"iOSclient","UserInformation":"iOSClient"]
let data = NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted,error:nil)
let jsons = NSString(data: data!, encoding: NSUTF8StringEncoding)
Alamofire.request(.POST, "http://myserver.com", parameters: [:], encoding: .Custom({
(convertible, params) in
var mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest
mutableRequest.HTTPBody = jsons!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
return (mutableRequest, nil)
}))
.response { request, response, data, error in
let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding)
println(dataString)
}
答案 0 :(得分:144)
如果您使用的是Alamofire v4.0 +,那么接受的答案将如下所示:
let parameters: [String: Any] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]
Alamofire.request("http://myserver.com", method: .post, parameters: parameters, encoding: JSONEncoding.default)
.responseJSON { response in
print(response)
}
答案 1 :(得分:80)
你很亲密。参数字典格式看起来不正确。您应该尝试以下方法:
let parameters: [String: AnyObject] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]
Alamofire.request(.POST, "http://myserver.com", parameters: parameters, encoding: .JSON)
.responseJSON { request, response, JSON, error in
print(response)
print(JSON)
print(error)
}
希望能解决您的问题。如果没有,请回复,我会相应地调整我的答案。
答案 2 :(得分:28)
到目前为止,我不喜欢任何其他答案(除了SwiftDeveloper的one之外),因为它们要么你要反序列化你的JSON,只是为了再次序列化,或者关心它JSON本身的结构。
afrodev在另一个问题中发布了正确的answer。你应该去投票吧。
以下是我的改编,稍作修改(主要是明确的UTF-8字符集)。
let urlString = "https://example.org/some/api"
let json = "{\"What\":\"Ever\"}"
let url = URL(string: urlString)!
let jsonData = json.data(using: .utf8, allowLossyConversion: false)!
var request = URLRequest(url: url)
request.httpMethod = HTTPMethod.post.rawValue
request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
request.httpBody = jsonData
Alamofire.request(request).responseJSON {
(response) in
print(response)
}
答案 3 :(得分:7)
Xcode 8.X,Swift 3.X
易于使用;
let params:NSMutableDictionary? = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
];
let ulr = NSURL(string:"http://myserver.com" as String)
let request = NSMutableURLRequest(url: ulr! as URL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let data = try! JSONSerialization.data(withJSONObject: params!, options: JSONSerialization.WritingOptions.prettyPrinted)
let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
if let json = json {
print(json)
}
request.httpBody = json!.data(using: String.Encoding.utf8.rawValue);
Alamofire.request(request as! URLRequestConvertible)
.responseJSON { response in
// do whatever you want here
print(response.request)
print(response.response)
print(response.data)
print(response.result)
}
答案 4 :(得分:3)
我略微编辑了SwiftDeveloper的答案,因为它对我不起作用。我也添加了Alamofire验证。
let body: NSMutableDictionary? = [
"name": "\(nameLabel.text!)",
"phone": "\(phoneLabel.text!))"]
let url = NSURL(string: "http://server.com" as String)
var request = URLRequest(url: url! as URL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let data = try! JSONSerialization.data(withJSONObject: body!, options: JSONSerialization.WritingOptions.prettyPrinted)
let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
if let json = json {
print(json)
}
request.httpBody = json!.data(using: String.Encoding.utf8.rawValue)
let alamoRequest = Alamofire.request(request as URLRequestConvertible)
alamoRequest.validate(statusCode: 200..<300)
alamoRequest.responseString { response in
switch response.result {
case .success:
...
case .failure(let error):
...
}
}
答案 5 :(得分:2)
我想通知的变化很少。从现在开始,您可以从响应对象访问请求,JSON和错误。
let urlstring = "Add URL String here"
let parameters: [String: AnyObject] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]
Alamofire.request(.POST, urlstring, parameters: parameters, encoding: .JSON).responseJSON { response in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
response.result.error
}
答案 6 :(得分:2)
如果您使用swift4
和Alamofire v4.0
,则接受的代码如下所示:
let parameters: Parameters = [ "username" : email.text!, "password" : password.text! ]
let urlString = "https://api.harridev.com/api/v1/login"
let url = URL.init(string: urlString)
Alamofire.request(url!, method: .put, parameters: , encoding: JSONEncoding.default, headers: nil).responseJSON { response in
switch response.result
{
case .success(let json):
let jsonData = json as! Any
print(jsonData)
case .failure(let error):
self.errorFailer(error: error)
}
}
答案 7 :(得分:1)
以下是我使用swift创建Http POST请求的方法,该请求需要带有Json编码和标题的参数。
创建的API客户端 BKCAPIClient作为共享实例,包括所有类型的请求,如POST,GET,PUT,DELETE等。
func postRequest(url:String, params:Parameters?, headers:HTTPHeaders?, completion:@escaping (_ responseData:Result<Any>?, _ error:Error?)->Void){
Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON {
response in
guard response.result.isSuccess,
(response.result.value != nil) else {
debugPrint("Error while fetching data: \(String(describing: response.result.error))")
completion(nil,response.result.error)
return
}
completion(response.result,nil)
}
}
创建的Operation类,包含特定请求所需的所有数据,还包含完成块内的解析逻辑。
func requestAccountOperation(completion: @escaping ( (_ result:Any?, _ error:Error?) -> Void)){
BKCApiClient.shared.postRequest(url: BKCConstants().bkcUrl, params: self.parametrs(), headers: self.headers()) { (result, error) in
if(error != nil){
//Parse and save to DB/Singletons.
}
completion(result, error)
}
}
func parametrs()->Parameters{
return ["userid”:”xnmtyrdx”,”bcode":"HDF"] as Parameters
}
func headers()->HTTPHeaders{
return ["Authorization": "Basic bXl1c2VyOm15cGFzcw",
"Content-Type": "application/json"] as HTTPHeaders
}
调用API在我们需要此数据的任何视图控制器中
func callToAPIOperation(){
let accOperation: AccountRequestOperation = AccountRequestOperation()
accOperation.requestAccountOperation{(result, error) in
}}
答案 8 :(得分:1)
如果有人想知道如何继续使用模型和东西,请参见下文
var itemArr: [Dictionary<String, String>] = []
for model in models {
let object = ["param1": model.param1,
"param2": model.param2]
itemArr.append(object as! [String : String])
}
let param = ["field1": someValue,
"field2": someValue,
"field3": itemArr] as [String : Any]
let url: URLConvertible = "http://------"
Alamofire.request(url, method: .post, parameters: param, encoding: JSONEncoding.default)
.responseJSON { response in
self.isLoading = false
switch response.result {
case .success:
break
case .failure:
break
}
}
答案 9 :(得分:1)
Alamofire使用POST,参数和标题获取数据
func feedbackApi(){
DispatchQueue.main.async {
let headers = [
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": "------"
]
let url = URL(string: "---------")
var parameters = [String:AnyObject]()
parameters = [
"device_id":"-----" as AnyObject,
"user_id":"----" as AnyObject,
"cinema_id":"-----" as AnyObject,
"session_id":"-----" as AnyObject,
]
Alamofire.request(url!, method: .post, parameters: parameters,headers:headers).responseJSON { response in
switch response.result{
case.success(let data):
self.myResponse = JSON(data)
print(self.myResponse as Any)
let slide = self.myResponse!["sliders"]
print(slide)
print(slide.count)
for i in 0..<slide.count{
let single = Sliders(sliderJson: slide[i])
self.slidersArray.append(single)
}
DispatchQueue.main.async {
self.getSliderCollection.reloadData()
}
case .failure(let error):
print("dddd",error)
}
}
}
}
答案 10 :(得分:1)
Alamofire〜5.2 和 Swift 5
您可以构建参数数据
使用fake json API
{
"Peril":[
"BF",
"BF"
],
"OccurrenceYear":[
2014,
2016
],
"Month":[
1,
1
],
"Event":[
"",
""
],
"InsuredLoss":[
10020623.440000998,
5370632.38
],
"UnderWriterYear":[
2013,
2015
],
"ReturnPeriod":[
12,
12
],
"SelectedIndex":[
1.801998974252194,
1.6036056232964842
],
"TrendedLoss":[
18057153.16024929,
8612376.28522618
]
}
答案 11 :(得分:0)
func get_Contact_list()
{
ApiUtillity.sharedInstance.showSVProgressHUD(text: "Loading..")
let cont_nunber = contact_array as NSArray
print(cont_nunber)
let token = UserDefaults.standard.string(forKey: "vAuthToken")!
let apiToken = "Bearer \(token)"
let headers = [
"Vauthtoken": apiToken,
"content-type": "application/json"
]
let myArray: [Any] = cont_nunber as! [Any]
let jsonData: Data? = try? JSONSerialization.data(withJSONObject: myArray, options: .prettyPrinted)
// var jsonString: String = nil
var jsonString = String()
if let aData = jsonData {
jsonString = String(data: aData, encoding: .utf8)!
}
let url1 = "URL"
var request = URLRequest(url: URL(string: url1)!)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = jsonData as! Data
// let session = URLSession.shared
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print("error=\(String(describing: error))")
ApiUtillity.sharedInstance.dismissSVProgressHUD()
return
}
print("response = \(String(describing: response))")
let responseString = String(data: data, encoding: .utf8)
print("responseString = \(String(describing: responseString))")
let json = self.convertStringToDictionary(text: responseString!)! as NSDictionary
print(json)
let status = json.value(forKey: "status") as! Int
if status == 200
{
let array = (json.value(forKey: "data") as! NSArray).mutableCopy() as! NSMutableArray
}
else if status == 401
{
ApiUtillity.sharedInstance.dismissSVProgressHUD()
}
else
{
ApiUtillity.sharedInstance.dismissSVProgressHUD()
}
}
task.resume()
}
func convertStringToDictionary(text: String) -> [String:AnyObject]? {
if let data = text.data(using: String.Encoding.utf8) {
do {
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:AnyObject]
return json
} catch {
print("Something went wrong")
}
}
return nil
}
答案 12 :(得分:0)
接受的答案 Xcode 11 - Swift 5 - Alamofire 5.0
func postRequest() {
let parameters: [String: Any] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]
AF.request("http://myserver.com", method:.post, parameters: parameters,encoding: JSONEncoding.default) .responseJSON { (response) in
print(response)
}
}
答案 13 :(得分:-3)
{
if Reachability.isConnectedToNetwork() == true
{
let hud = MBProgressHUD.showAdded(to: self.view, animated: true)
hud.mode = .indeterminate
hud.label.text = "Loading"
hud.animationType = .fade
var request = URLRequest(url: URL(string: "http://skandal24.serv.si/ws/webservice/forgot_password")!)
request.httpMethod = "POST"
let postString = String(format: "email=%@&lang=%@", arguments: [txt_emailVirify.text!, language!])
print(postString)
emailString = txt_emailVirify.text!
request.httpBody = postString.data(using: .utf8)
request.addValue("delta141forceSEAL8PARA9MARCOSBRAHMOS", forHTTPHeaderField: "Authorization")
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
Alamofire.request(request).responseJSON { response in
//Your code
print(response.value)
if response.response?.statusCode == 200
{
let dictionary = (response.value) as! AnyObject
let status = dictionary.value(forKey: "status") as! String
let sts = Int(status)
DispatchQueue.main.async()
{
if sts == 200
{
}
}
}
else
{
}
}
}
else
{
}
}