Как сделать HTTP-запрос в Swift?
Я читал язык программирования Swift от Apple в iBooks, но не могу понять, как сделать http-запрос (что-то вроде CURL) в Swift. Нужно ли импортировать классы Obj-C или мне просто нужно импортировать библиотеки по умолчанию? Или невозможно сделать HTTP-запрос на основе собственного swift-кода?
15 ответов:
другой вариант Alamofire lib, который предлагает цепные методы запроса / ответа.
https://github.com/Alamofire/Alamofire
сделать запрос
import Alamofire Alamofire.request(.GET, "http://httpbin.org/get")Ответ На Обращение
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) .response { request, response, data, error in print(request) print(response) print(error) }
можно использовать
URL,URLRequestиURLSessionилиNSURLConnectionкак вы обычно делаете в Objective-C. обратите внимание, что для iOS 7.0 и более поздних версий,URLSessionпредпочтительнее.используя
URLSessionинициализировать a
Проверьте Ниже Код :
1. SynchonousRequest
Swift 1.2
let urlPath: String = "YOUR_URL_HERE" var url: NSURL = NSURL(string: urlPath)! var request1: NSURLRequest = NSURLRequest(URL: url) var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?>=nil var dataVal: NSData = NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil)! var err: NSError println(response) var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary println("Synchronous\(jsonResult)")Swift 2.0 +
let urlPath: String = "YOUR_URL_HERE" let url: NSURL = NSURL(string: urlPath)! let request1: NSURLRequest = NSURLRequest(URL: url) let response: AutoreleasingUnsafeMutablePointer<NSURLResponse?>=nil do{ let dataVal = try NSURLConnection.sendSynchronousRequest(request1, returningResponse: response) print(response) do { if let jsonResult = try NSJSONSerialization.JSONObjectWithData(dataVal, options: []) as? NSDictionary { print("Synchronous\(jsonResult)") } } catch let error as NSError { print(error.localizedDescription) } }catch let error as NSError { print(error.localizedDescription) }2. AsynchonousRequest
Swift 1.2
let urlPath: String = "YOUR_URL_HERE" var url: NSURL = NSURL(string: urlPath)! var request1: NSURLRequest = NSURLRequest(URL: url) let queue:NSOperationQueue = NSOperationQueue() NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in var err: NSError var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary println("Asynchronous\(jsonResult)") })Swift 2.0 +
let urlPath: String = "YOUR_URL_HERE" let url: NSURL = NSURL(string: urlPath)! let request1: NSURLRequest = NSURLRequest(URL: url) let queue:NSOperationQueue = NSOperationQueue() NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in do { if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary { print("ASynchronous\(jsonResult)") } } catch let error as NSError { print(error.localizedDescription) } })3. Как обычно URL-соединение
Swift 1.2
var dataVal = NSMutableData() let urlPath: String = "YOUR URL HERE" var url: NSURL = NSURL(string: urlPath)! var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: true)! connection.start()затем
func connection(connection: NSURLConnection!, didReceiveData data: NSData!){ self.dataVal?.appendData(data) } func connectionDidFinishLoading(connection: NSURLConnection!) { var error: NSErrorPointer=nil var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal!, options: NSJSONReadingOptions.MutableContainers, error: error) as NSDictionary println(jsonResult) }Swift 2.0 +
var dataVal = NSMutableData() let urlPath: String = "YOUR URL HERE" var url: NSURL = NSURL(string: urlPath)! var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: true)! connection.start()затем
func connection(connection: NSURLConnection!, didReceiveData data: NSData!){ dataVal.appendData(data) } func connectionDidFinishLoading(connection: NSURLConnection!) { do { if let jsonResult = try NSJSONSerialization.JSONObjectWithData(dataVal, options: []) as? NSDictionary { print(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } }4. Асинхронными пост запрос
Swift 1.2
let urlPath: String = "YOUR URL HERE" var url: NSURL = NSURL(string: urlPath)! var request1: NSMutableURLRequest = NSMutableURLRequest(URL: url) request1.HTTPMethod = "POST" var stringPost="deviceToken=123456" // Key and Value let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding) request1.timeoutInterval = 60 request1.HTTPBody=data request1.HTTPShouldHandleCookies=false let queue:NSOperationQueue = NSOperationQueue() NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in var err: NSError var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary println("AsSynchronous\(jsonResult)") })Swift 2.0 +
let urlPath: String = "YOUR URL HERE" let url: NSURL = NSURL(string: urlPath)! let request1: NSMutableURLRequest = NSMutableURLRequest(URL: url) request1.HTTPMethod = "POST" let stringPost="deviceToken=123456" // Key and Value let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding) request1.timeoutInterval = 60 request1.HTTPBody=data request1.HTTPShouldHandleCookies=false let queue:NSOperationQueue = NSOperationQueue() NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in do { if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary { print("ASynchronous\(jsonResult)") } } catch let error as NSError { print(error.localizedDescription) } })5. Асинхронными сделать запрос
Swift 1.2
let urlPath: String = "YOUR URL HERE" var url: NSURL = NSURL(string: urlPath)! var request1: NSMutableURLRequest = NSMutableURLRequest(URL: url) request1.HTTPMethod = "GET" request1.timeoutInterval = 60 let queue:NSOperationQueue = NSOperationQueue() NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in var err: NSError var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary println("AsSynchronous\(jsonResult)") })Swift 2.0 +
let urlPath: String = "YOUR URL HERE" let url: NSURL = NSURL(string: urlPath)! let request1: NSMutableURLRequest = NSMutableURLRequest(URL: url) request1.HTTPMethod = "GET" let queue:NSOperationQueue = NSOperationQueue() NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in do { if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary { print("ASynchronous\(jsonResult)") } } catch let error as NSError { print(error.localizedDescription) } })6. Изображение (Файл) Загрузить
Swift 2.0 +
let mainURL = "YOUR_URL_HERE" let url = NSURL(string: mainURL) let request = NSMutableURLRequest(URL: url!) let boundary = "78876565564454554547676" request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") request.HTTPMethod = "POST" // POST OR PUT What you want let session = NSURLSession(configuration:NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: nil, delegateQueue: nil) let imageData = UIImageJPEGRepresentation(UIImage(named: "Test.jpeg")!, 1) var body = NSMutableData() body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // Append your parameters body.appendData("Content-Disposition: form-data; name=\"name\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("PREMKUMAR\r\n".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("Content-Disposition: form-data; name=\"description\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("IOS_DEVELOPER\r\n".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // Append your Image/File Data var imageNameval = "HELLO.jpg" body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("Content-Disposition: form-data; name=\"profile_photo\"; filename=\"\(imageNameval)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData(imageData!) body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) request.HTTPBody = body let dataTask = session.dataTaskWithRequest(request) { (data, response, error) -> Void in if error != nil { //handle error } else { let outputString : NSString = NSString(data:data!, encoding:NSUTF8StringEncoding)! print("Response:\(outputString)") } } dataTask.resume()
Основное Решение Swift 3
let url = URL(string: "http://www.stackoverflow.com") let task = URLSession.shared.dataTask(with: url! as URL) { data, response, error in guard let data = data, error == nil else { return } print(NSString(data: data, encoding: String.Encoding.utf8.rawValue)) } task.resume()
Swift 3 запрос данных с помощью URLSession API
//create the url with NSURL let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")! //change the url //create the session object let session = URLSession.shared //now create the URLRequest object using the url object let request = URLRequest(url: url) //create dataTask using the session object to send data to the server let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in guard error == nil else { return } guard let data = data else { return } do { //create json object from data if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { print(json) } } catch let error { print(error.localizedDescription) } }) task.resume()
Я использую обертку этого парня с хорошими результатами до сих пор https://github.com/daltoniam/swiftHTTP. не большой дырявых абстракций пока
пример
do { let opt = try HTTP.GET("https://google.com") opt.start { response in if let err = response.error { print("error: \(err.localizedDescription)") return //also notify app of failure as needed } print("opt finished: \(response.description)") //print("data is: \(response.data)") access the response of the data with response.data } } catch let error { print("got an error creating the request: \(error)") }
Я сделал HTTP запрос и методы GET & POST С разбор JSON таким образом:
on viewDidLoad ():
override func viewDidLoad() { super.viewDidLoad() makeGetRequest() makePostRequest() } func makePostRequest(){ let urlPath: String = "http://www.swiftdeveloperblog.com/http-post-example-script/" var url: NSURL = NSURL(string: urlPath)! var request: NSMutableURLRequest = NSMutableURLRequest(URL: url) request.HTTPMethod = "POST" var stringPost="firstName=James&lastName=Bond" // Key and Value let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding) request.timeoutInterval = 60 request.HTTPBody=data request.HTTPShouldHandleCookies=false let queue:NSOperationQueue = NSOperationQueue() NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary if (jsonResult != nil) { // Success println(jsonResult) let message = jsonResult["Message"] as! NSString println(message) }else { // Failed println("Failed") } }) } func makeGetRequest(){ var url : String = "http://api.androidhive.info/contacts/" var request : NSMutableURLRequest = NSMutableURLRequest() request.URL = NSURL(string: url) request.HTTPMethod = "GET" request.timeoutInterval = 60 NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary if (jsonResult != nil) { // Success println(jsonResult) let dataArray = jsonResult["contacts"] as! NSArray; for item in dataArray { // loop through data items let obj = item as! NSDictionary for (key, value) in obj { println("Key: \(key) - Value: \(value)") let phone = obj["phone"] as! NSDictionary; let mobile = phone["mobile"] as! NSString println(mobile) let home = phone["home"] as! NSString println(home) let office = phone["office"] as! NSString println(office) } } } else { // Failed println("Failed") } }) }сделал
подробности
Xcode 9.2, Swift 4
решение
import Foundation class Data { static fileprivate let queue = DispatchQueue(label: "requests.queue", qos: .utility) static fileprivate let mainQueue = DispatchQueue.main fileprivate class func make(session: URLSession = URLSession.shared, request: URLRequest, closure: @escaping (_ json: [String: Any]?, _ error: Error?)->()) { let task = session.dataTask(with: request) { data, response, error in queue.async { guard error == nil else { return } guard let data = data else { return } do { if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { mainQueue.async { closure(json, nil) } } } catch let error { print(error.localizedDescription) mainQueue.async { closure(nil, error) } } } } task.resume() } class func searchRequest(term: String, closure: @escaping (_ json: [String: Any]?, _ error: Error?)->()) { let url = URL(string: "https://itunes.apple.com/search?term=\(term.replacingOccurrences(of: " ", with: "+"))") let request = URLRequest(url: url!) Data.make(request: request) { json, error in closure(json, error) } } }использование
Data.searchRequest(term: "jack johnson") { json, error in print(error ?? "nil") print(json ?? "nil") print("Update views") }результаты
Я звоню в JSON на кнопку "Вход" нажмите кнопку
@IBAction func loginClicked(sender : AnyObject) { var request = NSMutableURLRequest(URL: NSURL(string: kLoginURL)) // Here, kLogin contains the Login API. var session = NSURLSession.sharedSession() request.HTTPMethod = "POST" var err: NSError? request.HTTPBody = NSJSONSerialization.dataWithJSONObject(self.criteriaDic(), options: nil, error: &err) // This Line fills the web service with required parameters. request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in var strData = NSString(data: data, encoding: NSUTF8StringEncoding) var err1: NSError? var json2 = NSJSONSerialization.JSONObjectWithData(strData.dataUsingEncoding(NSUTF8StringEncoding), options: .MutableLeaves, error:&err1 ) as NSDictionary println("json2 :\(json2)") if(err) { println(err!.localizedDescription) } else { var success = json2["success"] as? Int println("Success: \(success)") } }) task.resume() }здесь, я сделал отдельный словарь для параметров.
var params = ["format":"json", "MobileType":"IOS","MIN":"f8d16d98ad12acdbbe1de647414495ec","UserName":emailTxtField.text,"PWD":passwordTxtField.text,"SigninVia":"SH"]as NSDictionary return params } // You can add your own sets of parameter here.
можно использовать просто, a
python-requestsбиблиотека стилей протоколу HTTP.некоторые примеры отправки HTTP-запроса только с:
// synchronous GET request with URL query a=1 let r = Just.get("https://httpbin.org/get", params:["a":1]) // asynchronous POST request with form value and file uploads Just.post( "http://justiceleauge.org/member/register", data: ["username": "barryallen", "password":"ReverseF1ashSucks"], files: ["profile_photo": .URL(fileURLWithPath:"flash.jpeg", nil)] ) { (r) if (r.ok) { /* success! */ } }в обоих случаях результат запроса
rможно получить доступ способами, аналогичнымиpython-request:r.ok // is the response successful? r.statusCode // status code of response r.content // response body as NSData? r.text // response body as text? r.json // response body parsed by NSJSONSerielizationвы можете найти больше примеров в этой детская площадка
использование этой библиотеки в синхронном режиме на игровой площадке-это самое близкое к cURL, которое можно получить в Swift.
простой Swift 2.0 подход к созданию запроса HTTP GET
HTTP-запрос является асинхронным, поэтому вам нужен способ получить возвращаемое значение из HTTP-запроса. Этот подход использует Уведомители и распространяется на два класса.
пример заключается в проверке имени пользователя и пароля для маркера идентификатора с помощью веб-сайта http://www.example.com/handler.php?do=CheckUserJson&json= то есть файл называется обработчиком.PHP и есть переключатель на параметр do для получения спокойного подхода.
в viewDidLoad мы устанавливаем NotifierObserver, устанавливаем json и вызываем функцию getHTTPRequest. Он вернется к функции checkedUsernameAndPassword с возвращенным параметром из http-запроса.
override func viewDidLoad() { super.viewDidLoad() // setup the Notification observer to catch the result of check username and password NSNotificationCenter.defaultCenter().addObserver(self, selector: "checkedUsernameAndPassword:", name: CHECK_USERNAME_AND_PASSWORD, object: nil) let username = GlobalVariables.USER_NAME let password = GlobalVariables.PASSWORD // check username and password if let jsonString = Utility.checkUsernameAndPasswordJson(username, password:password){ print("json string returned = \(jsonString)") let url = CHECKUSERJSON+jsonString // CHECKUSERJSON = http://www.example.com/handler.php?do=CheckUserJson&json= // jsonString = {\"username\":\"demo\",\"password\":\"demo\"}" // the php script handles a json request and returns a string identifier Utility.getHTTPRequest(url,notifierId: CHECK_USERNAME_AND_PASSWORD) // the returned identifier is sent to the checkedUsernaeAndPassword function when it becomes availabel. } }в утилите есть две статические функции.swift сначала кодирует json, а затем выполняет HTTP-вызов.
static func checkUsernameAndPasswordJson(username: String, password: String) -> String?{ let para:NSMutableDictionary = NSMutableDictionary() para.setValue("demo", forKey: "username") para.setValue("demo", forKey: "password") let jsonData: NSData do{ jsonData = try NSJSONSerialization.dataWithJSONObject(para, options: NSJSONWritingOptions()) let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as! String return jsonString } catch _ { print ("UH OOO") return nil } }и Http-запрос
static func getHTTPRequest (url:String , notifierId: String) -> Void{ let urlString = url let config = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: nil) let safeURL = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! if let url = NSURL(string: safeURL){ let request = NSMutableURLRequest(URL: url) request.HTTPMethod = "GET" request.timeoutInterval = 60 let taskData = session.dataTaskWithRequest(request, completionHandler: { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in if (data != nil) { let result = NSString(data: data! , encoding: NSUTF8StringEncoding) sendNotification (notifierId, message: String(result), num: 0) }else{ sendNotification (notifierId, message: String(UTF8String: nil), num: -1) } }) taskData.resume() }else{ print("bad urlString = \(urlString)") } }в функция sendNotification завершает круг. Обратите внимание, что в наблюдателе есть ":" в конце строки селектора. Это позволяет уведомлению нести полезную нагрузку в userInfo. Я даю этому строку и Int.
static func sendNotification (key: String, message:String?, num: Int?){ NSNotificationCenter.defaultCenter().postNotificationName( key, object: nil, userInfo: (["message": message!, "num": "\(num!)"]) ) }обратите внимание, что использование HTTP является старомодным, предпочитайте HTTPS см. как загрузить HTTP-URL с включенной безопасностью транспорта приложений в iOS 9?
var post:NSString = "api=myposts&userid=\(uid)&page_no=0&limit_no=10" NSLog("PostData: %@",post); var url1:NSURL = NSURL(string: url)! var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)! var postLength:NSString = String( postData.length ) var request:NSMutableURLRequest = NSMutableURLRequest(URL: url1) request.HTTPMethod = "POST" request.HTTPBody = postData request.setValue(postLength, forHTTPHeaderField: "Content-Length") request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") var reponseError: NSError? var response: NSURLResponse? var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError) if ( urlData != nil ) { let res = response as NSHTTPURLResponse!; NSLog("Response code: %ld", res.statusCode); if (res.statusCode >= 200 && res.statusCode < 300) { var responseData:NSString = NSString(data:urlData!, encoding:NSUTF8StringEncoding)! NSLog("Response ==> %@", responseData); var error: NSError? let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as NSDictionary let success:NSInteger = jsonData.valueForKey("error") as NSInteger //[jsonData[@"success"] integerValue]; NSLog("Success: %ld", success); if(success == 0) { NSLog("Login SUCCESS"); self.dataArr = jsonData.valueForKey("data") as NSMutableArray self.table.reloadData() } else { NSLog("Login failed1"); ZAActivityBar.showErrorWithStatus("error", forAction: "Action2") } } else { NSLog("Login failed2"); ZAActivityBar.showErrorWithStatus("error", forAction: "Action2") } } else { NSLog("Login failed3"); ZAActivityBar.showErrorWithStatus("error", forAction: "Action2") }Это вам обязательно поможет
//вот пример, который работал для меня
/ / функция Swift, которая отправляет запрос на сервер с ключевыми значениями
func insertRecords() { let usrID = txtID.text let checkin = lblInOut.text let comment = txtComment.text // The address of the web service let urlString = "http://your_url/checkInOut_post.php" // These are the keys that your are sending as part of the post request let keyValues = "id=\(usrID)&inout=\(checkin)&comment=\(comment)" // 1 - Create the session by getting the configuration and then // creating the session let config = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: nil) // 2 - Create the URL Object if let url = NSURL(string: urlString){ // 3 - Create the Request Object var request = NSMutableURLRequest(URL: url) request.HTTPMethod = "POST" // set the key values request.HTTPBody = keyValues.dataUsingEncoding(NSUTF8StringEncoding); // 4 - execute the request let taskData = session.dataTaskWithRequest(request, completionHandler: { (data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in println("\(data)") // 5 - Do something with the Data back if (data != nil) { // we got some data back println("\(data)") let result = NSString(data: data , encoding: NSUTF8StringEncoding) println("\(result)") if result == "OK" { let a = UIAlertView(title: "OK", message: "Attendece has been recorded", delegate: nil, cancelButtonTitle: "OK") println("\(result)") dispatch_async(dispatch_get_main_queue()) { a.show() } } else { // display error and do something else } } else { // we got an error println("Error getting stores :\(error.localizedDescription)") } }) taskData.resume() } }PHP код для получения ключевых значений
$empID = $_POST ['id'];
$inOut = $_POST ['inout'];
$comment = $_POST ['comment'];
вот очень простой Swift 4 пример на детской площадке:
import UIKit // run asynchronously in a playground import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true // create a url let url = URL(string: "http://www.stackoverflow.com") // create a data task let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in if error != nil { print("there's a problem") } print(String(data: data!, encoding: String.Encoding.utf8) ?? "") } //running the task w/ resume task.resume()
на Swift 4.2 и Xcode10.
это JSON POST подход
func yourFunctionName { //Check internet connection let networkReachability = Reachability.forInternetConnection() let networkStatus:Int = (networkReachability?.currentReachabilityStatus())!.rawValue print(networkStatus) if networkStatus == NotReachable.rawValue { let msg = SharedClass.sharedInstance.noNetMsg//Message //Call alert from shared class SharedClass.sharedInstance.alert(view: self, title: "", message: msg) } else { //Call spinner from shared class SharedClass.sharedInstance.activityIndicator(view: self.view)//Play spinner let parameters = "Your parameters here" var request = URLRequest(url: URL(string: url)!) request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" print("URL : \(request)") request.httpBody = parameters.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 //Stop spinner SharedClass.sharedInstance.stopActivityIndicator() //Stop spinner //Print error in alert SharedClass.sharedInstance.alert(view: self, title: "", message: "\(String(describing: error!.localizedDescription))") return } SharedClass.sharedInstance.stopActivityIndicator() //Stop spinner if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors print("statusCode should be 200, but is \(httpStatus.statusCode)") print("response = \(String(describing: response))") } do { let response = try JSONSerialization.jsonObject(with: data, options: []) as? [String: AnyObject] print(response!) //Your code here } catch let error as NSError { print(error) } } task.resume() } }Если у вас есть интерес, чтобы использовать эту функцию в SharedClass
//My shared class import UIKit class SharedClass: NSObject { static let sharedInstance = SharedClass() func postRequestFunction(apiName: String , parameters: String, onCompletion: @escaping (_ success: Bool, _ error: Error?, _ result: [String: Any]?)->()) { var URL = "your URL here/index.php/***?" URL = URL.replacingOccurrences(of: "***", with: apiName) var request = URLRequest(url: URL(string: URL)!) request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" print("shared URL : \(request)") request.httpBody = parameters.data(using: .utf8) var returnRes:[String:Any] = [:] let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { onCompletion(false, error, nil) } else { guard let data = data else { onCompletion(false, error, nil) return } if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 200 { do { returnRes = try JSONSerialization.jsonObject(with: data, options: []) as! [String : Any] onCompletion(true, nil, returnRes) } catch let error as NSError { onCompletion(false, error, nil) } } else { onCompletion(false, error, nil) } } } task.resume() } private override init() { }и, наконец, вызовите эту функцию вот так....
SharedClass.sharedInstance.postRequestFunction(apiName: "create_project_list", parameters: parameters) { (success, error, result) in print(result!) if success { //Your code here } else { print(error?.localizedDescription ?? "") } }

Comments