Como enviar uma solicitação POST com BODY em swift

Estou tentando fazer um pedido de postagem com um corpo rápido usando o Alamofire.

meu corpo json parece:

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

Eu estou tentando let list com NSDictionnary que se parecem com:

 [[Time: 30, IdQuestion: 6510, idProposition: 10], [Time: 30, IdQuestion: 8284, idProposition: 10]] 

e meu pedido usando o Alamofire se parece com:

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

A solicitação tem um erro e acredito que o problema é com a lista Dicionário, pois se eu fizer uma requisição sem a lista ela funciona bem, então alguma ideia?


Eu tentei a solução sugerida, mas estou enfrentando o mesmo problema:

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

Você está perto. A formatação do dictionary de parâmetros não parece correta. Você deve tentar o seguinte:

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

Espero que isso tenha resolvido o seu problema. Se isso não acontecer, responda e ajustarei minha resposta de acordo.

Se você estiver usando o Alamofire v4.0 +, a resposta aceita será assim:

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

Eu não gosto de nenhuma das outras respostas até agora (exceto talvez a de SwiftDeveloper), porque elas requerem que você desserialize seu JSON, apenas para que ele seja serializado novamente, ou se preocupe com a estrutura do próprio JSON.

A resposta correta foi postada pelo afrodev em outra pergunta. Você deve ir e upvote.

Abaixo está apenas a minha adaptação, com algumas pequenas alterações (principalmente explícita UTF-8 charset).

 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

Uso Fácil;

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

Eu editei um pouco a resposta do SwiftDeveloper , porque não estava funcionando para mim. Eu adicionei a validação do Alamofire também.

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

Há poucas alterações que gostaria de notificar. Você pode acessar o pedido, JSON, erro do object de resposta a partir de agora.

  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 } 

Se você estiver usando o swift4 e o Alamofire v4.0 , o código aceito ficaria assim:

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

Aqui está como eu criei a solicitação Http POST com swift que precisa de parâmetros com codificação Json e com headers.

Criada API Client BKCAPIClient como uma instância compartilhada que includeá todos os tipos de solicitações, como POST, GET, PUT, DELETE etc.

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

Classe de operação criada que contém todos os dados necessários para uma solicitação específica e também contém lógica de análise dentro do bloco de conclusão.

 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 } 

Call API Em qualquer View Controller, onde precisamos desses dados

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