Как отправить запрос POST с BODY в быстром

Я пытаюсь сделать запрос с телом в быстром использовании Alamofire.

мое тело json выглядит так:

{ "IdQuiz" : 102, "IdUser" : "iosclient", "User" : "iosclient", "List":[ { "IdQuestion" : 5, "IdProposition": 2, "Time" : 32 }, { "IdQuestion" : 4, "IdProposition": 3, "Time" : 9 } ] } 

Я пытаюсь сделать list с NSDictionnary, который выглядит так:

 [[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) } 

Вы близки. Форматирование словаря параметров не выглядит корректным. Вы должны попробовать следующее:

 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) } 

Надеюсь, это укрепило вашу проблему. Если это не так, ответьте, и я соответствующим образом отрегулирую свой ответ.

Если вы используете 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) } 

Мне пока не нравится какой-либо из других ответов (кроме, может быть, SwiftDeveloper), потому что они либо требуют от вас десериализации вашего JSON, только для того, чтобы его снова сериализовали, либо заботились о структуре самого JSON.

Правильный ответ был отправлен afrodev в другом вопросе. Вы должны пойти и укрепить его.

Ниже приведена только моя адаптация с некоторыми незначительными изменениями (в первую очередь явная кодировка 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) } 

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) } 

Я слегка отредактировал ответ 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): ... } } 

Есть несколько изменений, которые я хотел бы уведомить. С этого момента вы можете получить доступ к запросу, 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 } 

Если вы используете 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) } } 

Вот как я создал запрос Http POST с быстрым, который требует параметров с кодировкой Json и с заголовками.

Созданный клиент API BKCAPIClient как общий экземпляр, который будет включать все типы запросов, таких как POST, GET, PUT, DELETE и т. Д.

 func postRequest(url:String, params:Parameters?, headers:HTTPHeaders?, completion:@escaping (_ responseData:Result?, _ 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) } } 

Созданный class операций, который содержит все данные, необходимые для конкретного запроса, а также содержит логику синтаксического анализа внутри блока завершения.

 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 вызовов В любом controllerе просмотра, где нам нужны эти данные

 func callToAPIOperation(){ let accOperation: AccountRequestOperation = AccountRequestOperation() accOperation.requestAccountOperation{(result, error) in }} 

{

  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 { } } 
  • swift: изменение массивов внутри словарей
  • Swift 4 "Этот class не соответствует кодированию ключевого значения"
  • Что такое ключевое слово open в Swift?
  • Эквивалент BigInteger в Swift?
  • Вырезать UIImage в круг
  • Как я могу рассчитать разницу между двумя датами?
  • Как использовать пользовательские ключи с протоколом Swift 4 Decodable?
  • Параметры «var» устарели и будут удалены в Swift 3
  • Чтение и запись строки из текстового файла
  • Чтение в файле JSON с использованием Swift
  • Получить пользовательскую версию имени classа в swift (в objc NSStringFromClass было хорошо)
  • Давайте будем гением компьютера.