J'essaie d'exécuter une requête HTTP dans Swift, pour POST 2 paramètres à une URL.
Exemple:
Lien: www.thisismylink.com/postName.php
Paramètres:
id = 13
name = Jack
Quelle est la manière la plus simple de faire cela?
Je ne veux même pas lire la réponse. Je veux juste envoyer cela pour effectuer des modifications sur ma base de données via un fichier PHP.
post
swift
parameters
http-post
httprequest
en colère
la source
la source
Réponses:
Dans Swift 3 et versions ultérieures, vous pouvez:
let url = URL(string: "http://www.thisismylink.com/postName.php")! var request = URLRequest(url: url) request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" let parameters: [String: Any] = [ "id": 13, "name": "Jack & Jill" ] request.httpBody = parameters.percentEncoded() let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, let response = response as? HTTPURLResponse, error == nil else { // check for fundamental networking error print("error", error ?? "Unknown error") return } guard (200 ... 299) ~= response.statusCode else { // check for http errors print("statusCode should be 2xx, but is \(response.statusCode)") print("response = \(response)") return } let responseString = String(data: data, encoding: .utf8) print("responseString = \(responseString)") } task.resume()
Où:
extension Dictionary { func percentEncoded() -> Data? { return map { key, value in let escapedKey = "\(key)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? "" let escapedValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? "" return escapedKey + "=" + escapedValue } .joined(separator: "&") .data(using: .utf8) } } extension CharacterSet { static let urlQueryValueAllowed: CharacterSet = { let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4 let subDelimitersToEncode = "!$&'()*+,;=" var allowed = CharacterSet.urlQueryAllowed allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)") return allowed }() }
Cela vérifie à la fois les erreurs de réseau fondamentales et les erreurs HTTP de haut niveau. Ce pourcentage échappe également correctement aux paramètres de la requête.
Notez que j'ai utilisé un
name
deJack & Jill
, pour illustrer lex-www-form-urlencoded
résultat correct dename=Jack%20%26%20Jill
, qui est «encodé en pourcentage» (c'est-à-dire que l'espace est remplacé par%20
et&
la valeur est remplacée par%26
).Voir la révision précédente de cette réponse pour le rendu Swift 2.
la source
POST
requête triviale , vous pouvez utiliser ce qui précède.$_POST
noms de fichiers, je réduirais cela à quelque chose de plus simple: le script PHP ne fonctionnera pas du tout si vous n'obtenez pas l'URL correcte. Mais ce n'est pas toujours le cas où vous devez inclure le nom de fichier (par exemple, le serveur peut effectuer un routage URL ou avoir des noms de fichiers par défaut). Dans ce cas, l'OP nous a donné une URL qui comprenait un nom de fichier, donc j'ai simplement utilisé la même URL que lui.URLSession
cet égard. Toutes les API de mise en réseau sont intrinsèquement asynchrones, elles devraient également l'être. Désormais, si vous recherchez d'autres moyens élégants de traiter les requêtes asynchrones, vous pouvez envisager de lesURLSession
encapsuler ( requêtes ou requêtes Alamofire) dans uneOperation
sous-classe personnalisée asynchrone . Ou vous pouvez utiliser une bibliothèque de promesses, comme PromiseKit.Swift 4 et supérieur
@IBAction func submitAction(sender: UIButton) { //declare parameter as a dictionary which contains string as key and value combination. considering inputs are valid let parameters = ["id": 13, "name": "jack"] //create the url with URL let url = URL(string: "www.thisismylink.com/postName.php")! //change the url //create the session object let session = URLSession.shared //now create the URLRequest 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 nsdata object and set it as request body } catch let error { print(error.localizedDescription) } 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 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) // handle json... } } catch let error { print(error.localizedDescription) } }) task.resume() }
la source
Pour tous ceux qui recherchent un moyen propre d'encoder une requête POST dans Swift 5.
Vous n'avez pas besoin de gérer l'ajout manuel du codage en pourcentage. Utilisez
URLComponents
pour créer une URL de requête GET. Utilisez ensuite laquery
propriété de cette URL pour obtenir correctement le pourcentage de chaîne de requête échappée.let url = URL(string: "https://example.com")! var components = URLComponents(url: url, resolvingAgainstBaseURL: false)! components.queryItems = [ URLQueryItem(name: "key1", value: "NeedToEscape=And&"), URLQueryItem(name: "key2", value: "vålüé") ] let query = components.url!.query
Le
query
sera une chaîne correctement échappée:Vous pouvez maintenant créer une requête et utiliser la requête comme HTTPBody:
var request = URLRequest(url: url) request.httpMethod = "POST" request.httpBody = Data(query.utf8)
Vous pouvez maintenant envoyer la demande.
la source
Voici la méthode que j'ai utilisée dans ma bibliothèque de journalisation: https://github.com/goktugyil/QorumLogs
Cette méthode remplit les formulaires html dans Google Forms.
var url = NSURL(string: urlstring) var request = NSMutableURLRequest(URL: url!) request.HTTPMethod = "POST" request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type") request.HTTPBody = postData.dataUsingEncoding(NSUTF8StringEncoding) var connection = NSURLConnection(request: request, delegate: nil, startImmediately: true)
la source
application/x-www-form-urlencoded
que vous réglez?let session = URLSession.shared let url = "http://...." let request = NSMutableURLRequest(url: NSURL(string: url)! as URL) request.httpMethod = "POST" request.addValue("application/json", forHTTPHeaderField: "Content-Type") var params :[String: Any]? params = ["Some_ID" : "111", "REQUEST" : "SOME_API_NAME"] do{ request.httpBody = try JSONSerialization.data(withJSONObject: params, options: JSONSerialization.WritingOptions()) let task = session.dataTask(with: request as URLRequest as URLRequest, completionHandler: {(data, response, error) in if let response = response { let nsHTTPResponse = response as! HTTPURLResponse let statusCode = nsHTTPResponse.statusCode print ("status code = \(statusCode)") } if let error = error { print ("\(error)") } if let data = data { do{ let jsonResponse = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) print ("data = \(jsonResponse)") }catch _ { print ("OOps not good JSON formatted response") } } }) task.resume() }catch _ { print ("Oops something happened buddy") }
la source
@IBAction func btn_LogIn(sender: AnyObject) { let request = NSMutableURLRequest(URL: NSURL(string: "http://demo.hackerkernel.com/ios_api/login.php")!) request.HTTPMethod = "POST" let postString = "email: [email protected] & password: testtest" request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request){data, response, error in guard error == nil && data != nil else{ print("error") return } if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200{ print("statusCode should be 200, but is \(httpStatus.statusCode)") print("response = \(response)") } let responseString = String(data: data!, encoding: NSUTF8StringEncoding) print("responseString = \(responseString)") } task.resume() }
la source
Toutes les réponses ici utilisent des objets JSON. Cela nous a posé des problèmes avec les
$this->input->post()
méthodes de nos contrôleurs Codeigniter. LeCI_Controller
ne peut pas lire directement JSON. Nous avons utilisé cette méthode pour le faire SANS JSONfunc postRequest() { // Create url object guard let url = URL(string: yourURL) else {return} // Create the session object let session = URLSession.shared // Create the URLRequest object using the url object var request = URLRequest(url: url) // Set the request method. Important Do not set any other headers, like Content-Type request.httpMethod = "POST" //set http method as POST // Set parameters here. Replace with your own. let postData = "param1_id=param1_value¶m2_id=param2_value".data(using: .utf8) request.httpBody = postData // Create a task using the session object, to run and return completion handler let webTask = session.dataTask(with: request, completionHandler: {data, response, error in guard error == nil else { print(error?.localizedDescription ?? "Response Error") return } guard let serverData = data else { print("server data error") return } do { if let requestJson = try JSONSerialization.jsonObject(with: serverData, options: .mutableContainers) as? [String: Any]{ print("Response: \(requestJson)") } } catch let responseError { print("Serialisation in error in creating response body: \(responseError.localizedDescription)") let message = String(bytes: serverData, encoding: .ascii) print(message as Any) } // Run the task webTask.resume() }
Votre CI_Controller pourra désormais obtenir
param1
etparam2
utiliser$this->input->post('param1')
et$this->input->post('param2')
la source