How to make an HTTP message request with a JSON body in Swift

I am trying to request an HTTP message with a JSON body:

How to add NSdictionnary to the body of an HTTP request.

Here is my code, it does not work properly.

var entry1 = Response(IdQuestion: 6510,IdProposition: 10,Time: 30) var entry2 = Response(IdQuestion: 8284,IdProposition: 10,Time: 30) Responses.append(entry1) Responses.append(entry2) let list = Responses.map { $0.asDictionary } let json = ["List":list,"IdSurvey":"102","IdUser":"iOSclient","UserInformation":"iOSClient"] let data : NSData = NSKeyedArchiver.archivedDataWithRootObject(json) NSJSONSerialization.isValidJSONObject(json) let myURL = NSURL(string: "http://www.myserver.com")! let request = NSMutableURLRequest(URL: myURL) request.HTTPMethod = "POST" request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") request.HTTPBody = data let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in println(response) // Your completion handler code here } task.resume() 
+90
json post swift
Aug 11 '15 at 9:13
source share
11 answers

Try it,

 // prepare json data let json: [String: Any] = ["title": "ABC", "dict": ["1":"First", "2":"Second"]] let jsonData = try? JSONSerialization.data(withJSONObject: json) // create post request let url = URL(string: "http://httpbin.org/post")! var request = URLRequest(url: url) request.httpMethod = "POST" // insert json data to the request request.httpBody = jsonData let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { print(error?.localizedDescription ?? "No data") return } let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) if let responseJSON = responseJSON as? [String: Any] { print(responseJSON) } } task.resume() 

or try the convenient Alamofire method

+169
Aug 11 '15 at 9:36
source
— -

Swift HTTP post fixing bugs

 let json = [ Activity.KEY_IDSUBJECT : activity.idSubject, Activity.KEY_RECORDMODE : "3", Activity.KEY_LOCATION_LONGITUDE : "0",Activity.KEY_LOCATION_LATITUDE : "0", Activity.KEY_CHECKIN : String(activity.dateCheckIn), Activity.KEY_CHECKOUT : String(activity.dateCheckOut) ] do { let jsonData = try NSJSONSerialization.dataWithJSONObject(json, options: .PrettyPrinted) // create post request let url = NSURL(string: "https://...appspot.com/_ah/api/activityendpoint/v1/activity")! let request = NSMutableURLRequest(URL: url) request.HTTPMethod = "POST" // insert json data to the request request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") request.HTTPBody = jsonData let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in if error != nil{ print("Error -> \(error)") return } do { let result = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject] print("Result -> \(result)") } catch { print("Error -> \(error)") } } task.resume() return task } catch { print(error) } 
+39
Dec 22 '15 at 14:39
source

Swift 3 and 4

HTTP POST request using URLSession API in Swift 4

 func postRequest(username: String, password: String, completion: @escaping ([String: Any]?, Error?) -> Void) { //declare parameter as a dictionary which contains string as key and value combination. let parameters = ["name": username, "password": password] //create the url with NSURL let url = URL(string: "https://www.myserver.com/api/login")! //create the session object let session = URLSession.shared //now create the Request object using the url object var request = URLRequest(url: url) request.httpMethod = "POST" //set http method as POST do { request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) // pass dictionary to data object and set it as request body } catch let error { print(error.localizedDescription) completion(nil, error) } //HTTP Headers request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") //create dataTask using the session object to send data to the server let task = session.dataTask(with: request, completionHandler: { data, response, error in guard error == nil else { completion(nil, error) return } guard let data = data else { completion(nil, NSError(domain: "dataNilError", code: -100001, userInfo: nil)) return } do { //create json object from data guard let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] else { completion(nil, NSError(domain: "invalidJSONTypeError", code: -100009, userInfo: nil)) return } print(json) completion(json, nil) } catch let error { print(error.localizedDescription) completion(nil, error) } }) task.resume() } @objc func submitAction(_ sender: UIButton) { //call postRequest with username and password parameters postRequest(username: "username", password: "password") { (result, error) in if let result = result { print("success: \(result)") } else if let error = error { print("error: \(error.localizedDescription)") } } 

Using Alamofire:

 let parameters = ["name": "username", "password": "password123"] Alamofire.request("https://www.myserver.com/api/login", method: .post, parameters: parameters, encoding: URLEncoding.httpBody) 
+31
Dec 11 '16 at 2:59
source
 let url = URL(string: "url")! var request = URLRequest(url: url) request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") request.httpMethod = "POST" let postString = "ChangeAccordingtoyourdata=\(paramOne)&ChangeAccordingtoyourdata2=\(paramTwo)" request.httpBody = postString.data(using: .utf8) let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error print("error=\(error)") return } if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors print("statusCode should be 200, but is \(httpStatus.statusCode)") print("response = \(response)") SVProgressHUD.showError(withStatus: "Request has not submitted successfully.\nPlease try after some time") } let responseString = String(data: data, encoding: .utf8) print("responseString = \(responseString)") SVProgressHUD.showSuccess(withStatus: "Request has submitted successfully.\nPlease wait for a while") DispatchQueue.main.async { // enter code } } task.resume() 
+4
May 18 '18 at 15:39
source

you can do something like this:

 func HTTPPostJSON(url: String, data: NSData, callback: (String, String?) -> Void) { var request = NSMutableURLRequest(URL: NSURL(string: url)!) request.HTTPMethod = "POST" request.addValue("application/json",forHTTPHeaderField: "Content-Type") request.addValue("application/json",forHTTPHeaderField: "Accept") request.HTTPBody = data HTTPsendRequest(request, callback: callback) } func HTTPsendRequest(request: NSMutableURLRequest, callback: (String, String?) -> Void) { let task = NSURLSession.sharedSession() .dataTaskWithRequest(request) { (data, response, error) -> Void in if (error != nil) { callback("", error.localizedDescription) } else { callback(NSString(data: data, encoding: NSUTF8StringEncoding)! as String, nil) } } task.resume() } //use var data :Dictionary<String, AnyObject> = yourDictionaryData<-- var requestNSData:NSData = NSJSONSerialization.dataWithJSONObject(request, options:NSJSONWritingOptions(0), error: &err)! HTTPPostJSON("http://yourPosturl..", data: requestNSData) { (response, error) -> Void in if error != nil{ //error return; } println(response); } 
+3
Aug 11 '15 at 9:42 on
source

The following Swift 5 Playground code shows a possible way to solve your problem using JSONSerialization and URLSession :

 import UIKit import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true let url = URL(string: "http://localhost:8080/new")! let jsonDict = ["firstName": "Jane", "lastName": "Doe"] let jsonData = try! JSONSerialization.data(withJSONObject: jsonDict, options: []) var request = URLRequest(url: url) request.httpMethod = "post" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = jsonData let task = URLSession.shared.dataTask(with: request) { (data, response, error) in if let error = error { print("error:", error) return } do { guard let data = data else { return } guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: AnyObject] else { return } print("json:", json) } catch { print("error:", error) } } task.resume() 
+3
Dec 08 '16 at 20:33
source
 var request = URLRequest(url: URL(string: "http://yogpande.apphb.com/api/my/posttblhouse")!) request.httpMethod = "POST" let postString = "email=testname@gmail.com&password=1234567" request.httpBody = postString.data(using: .utf8) let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { print("error=(error)") return } if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { print("statusCode should be 200, but is \(httpStatus.statusCode)") print("response = \(response)") } let responseString = String(data: data, encoding: .utf8) print("responseString = \(responseString)") } task.resume() } 
+1
Jul 19 '17 at 4:06 on
source

Swift4 - Apple Solution "POST" and "Codable"

Uploading data to the site using request.httpmethod = "Post" and Codable Stucts :

@see: Listing 2 Configuring a URL request

 let userlogin = User(username: username, password: password, deviceid:UIDevice.current.identifierForVendor!.uuidString) guard let uploadData = try? JSONEncoder().encode(userlogin) else { print("Error UploadData: ") return } let urlUser = URL(string: APPURL.apiURL)! var request = URLRequest(url: urlUser) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") var responseStatus = 0 let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in if let error = error { let code = (error as NSError).code print("Error:\(code) : \(error.localizedDescription)") completion(code) return } guard let response = response as? HTTPURLResponse else { print("Invalid response") return } // do your response handling here ... 
+1
Jun 04 '18 at 14:00
source

// prepare json data let mapDict = ["1": "First", "2": "Second"]

  let json = [ "title":"ABC" , "dict": mapDict ] as [String : Any] let jsonData : NSData = NSKeyedArchiver.archivedData(withRootObject: json) as NSData // create post request let url = NSURL(string: "http://httpbin.org/post")! let request = NSMutableURLRequest(url: url as URL) request.httpMethod = "POST" // insert json data to the request request.httpBody = jsonData as Data let task = URLSession.shared.dataTask(with: request as URLRequest){ data,response,error in if error != nil{ return } do { let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] print("Result",result!) } catch { print("Error -> \(error)") } } task.resume() 
0
Dec 30 '16 at 17:38
source
  var request = URLRequest(url: URL(string: "your URL")!) 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") let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { print("error=\(String(describing: error))") return } do { let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! NSDictionary print(dictionary) let status = dictionary.value(forKey: "status") as! String let sts = Int(status) DispatchQueue.main.async() { if sts == 200 { print(dictionary) } else { self.alertMessageOk(title: self.Alert!, message: dictionary.value(forKey: "message") as! String) } } } catch { print(error) } } task.resume() 
0
Sep 22 '17 at 6:12
source

func fucntion () {

  var parameters = [String:String]() let apiToken = "Bearer \(ApiUtillity.sharedInstance.getUserData(key: "vAuthToken"))" let headers = ["Vauthtoken":apiToken] parameters = ["firstname":name,"lastname":last_name,"mobile":mobile_number,"email":emails_Address] Alamofire.request(ApiUtillity.sharedInstance.API(Join: "user/edit_profile"), method: .post, parameters: parameters, encoding: URLEncoding.default,headers:headers).responseJSON { response in debugPrint(response) if let json = response.result.value { let dict:NSDictionary = (json as? NSDictionary)! print(dict) // print(response) let StatusCode = dict.value(forKey: "status") as! Int if StatusCode==200 { ApiUtillity.sharedInstance.dismissSVProgressHUDWithSuccess(success: "Success") let UserData = dict.value(forKey: "data") as! NSDictionary print(UserData) } else if StatusCode==401 { let ErrorDic:NSDictionary = dict.value(forKey: "message") as! NSDictionary let ErrorMessage = ErrorDic.value(forKey: "error") as! String } else { let ErrorDic:NSDictionary = dict.value(forKey: "message") as! NSDictionary let ErrorMessage = ErrorDic.value(forKey: "error") as! String } } else { ApiUtillity.sharedInstance.dismissSVProgressHUDWithError(error: "Something went wrong") } } 
0
Nov 29 '18 at 17:11
source



All Articles