Параметры HTTP Post передаются в кодировке 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?

2

Решение

Вы хотите, чтобы проценты-экранировать запрос в 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: "+")
}
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]