Параметры HTTP-сообщения передаются json, закодированные до $ _POST

Я не могу понять, как правильно отправлять параметры POST.

Мой быстрый 3:

let parameters = ["name": "thom", "password": "12345"] as Dictionary<String, String> let url = URL(string: "https://mywebsite.com/test.php")! let session = URLSession.shared var request = URLRequest(url: url) request.httpMethod = "POST" do { request.httpBody = try JSONSerialization.data(withJSONObject: parameters) } catch let error { print(error.localizedDescription) } request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in guard error == nil else { print(error as Any) return } guard let data = data else { return } do { if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { print(json) print(json["post"]!) } else { print("no json") } } catch let error { print(error.localizedDescription) } }) task.resume() 

Мой PHP:

 <?php header('Content-Type: application/json'); if(empty($_POST)) echo json_encode(array('post'=>'empty')); else echo json_encode($_POST+array('post'=>'not_empty')); exit; 

Если я устанавливаю заголовок типа контента (в Swift) в application/json я получаю:

 ["post": empty] empty 

Если я установил его в application/x-www-form-urlencoded я получаю:

 ["{\"name\":\"thom\",\"password\":\"12345\"}": , "post": not_empty] not_empty 

Как отправить словарь на мой сервер как пары $ _POST ключ / значение, а не как строку json_encoded?

    Вы хотите, чтобы процентный запрос был x-www-form-urlencoded запрос x-www-form-urlencoded , например:

     let parameters = ["name": "thom", "password": "12345"] let url = URL(string: "https://mywebsite.com/test.php")! var request = URLRequest(url: url) request.httpMethod = "POST" request.updateHttpBody(with: parameters) request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") let task = session.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { print("\(error)") return } // handle response here } task.resume() 

    где

     extension URLRequest { /// Populate the `httpBody` of `application/x-www-form-urlencoded` request. /// /// - parameter parameters: A dictionary of keys and values to be added to the request mutating func updateHttpBody(with parameters: [String : String]) { let parameterArray = parameters.map { (key, value) -> String in return "\(key.addingPercentEncodingForQueryValue()!)=\(value.addingPercentEncodingForQueryValue()!)" } httpBody = parameterArray.joined(separator: "&").data(using: .utf8) } } extension String { /// Percent escape value to be added to a HTTP request /// /// This percent-escapes all characters besides the alphanumeric character set and "-", ".", "_", and "*". /// This will also replace spaces with the "+" character as outlined in the application/x-www-form-urlencoded spec: /// /// http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm /// /// - returns: Return percent escaped string. func addingPercentEncodingForQueryValue() -> String? { let generalDelimitersToEncode = ":#[]@?/" let subDelimitersToEncode = "!$&'()*+,;=" var allowed = CharacterSet.urlQueryAllowed allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)") return addingPercentEncoding(withAllowedCharacters: allowed)?.replacingOccurrences(of: " ", with: "+") } }