Как отправить почтовый запрос с телом в swift
Я пытаюсь сделать запрос post с телом в swift, используя Alamofire.
мое тело JSON выглядит так :
{
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List":[
{
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
},
{
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
}
]
}
Я пытаюсь сделать letlist С 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)
}
запрос имеет ошибку, и я считаю, что проблема заключается в списке словарей, потому что если я делаю запрос без списка, он отлично работает, поэтому любая идея ?
я попробовал предложенное решение, но я столкнулся с той же проблемой :
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)
}
9 ответов:
вы близки. Форматирование словаря параметров не выглядит правильным. Вы должны попробовать следующее:
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) }
мне не нравится ни один из других ответов до сих пор (за исключением, возможно,один by 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 с swift, который нуждается в параметрах с кодировкой Json и с заголовками.
созданный клиент API BKCAPIClient как совместно используемый экземпляр, который будет включать все типы запросов, такие как Post, сделать, поставить, удалить и т. д.
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) } }создан класс операций, который содержит все данные, необходимые для конкретного запроса, а также содержит логику синтаксического анализа внутри блока завершения.
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 }}
{
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 { } }
Comments