Не стесняйтесь принять ответ Йоакима , который выявил синтаксические проблемы, но я хотел сделать еще одно замечание.В частности, ваш запрос не будет работать или не будет работать должным образом, если testPOST
содержит какие-либо зарезервированные символы (например, пробел, &
, +
и т. Д.).Если вы не знаете, что testPOST
никогда не может содержать такие символы, следует кодировать значение в процентах при построении запроса, например:
func fetchJSON() {
guard
let url = URL(string: "https://example.com/example/example.php"),
let value = testPOST.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)
else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = "value=\(value)".data(using: .utf8)
URLSession.shared.dataTask(with: request) { data, _, error in
DispatchQueue.main.async {
// ...
}
}.resume()
}
Где
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
}()
}
Кстати, это такжеРекомендуется (хотя часто и не требуется) устанавливать несколько заголовков, в частности Content-Type
(указание, как кодируется запрос) и Accept
(как клиент ожидает, что ответ будет закодирован).
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
Ваш веб-сервис явно не учитывает эти заголовки, но многие веб-сервисы делают.Кроме того, это делает цель вашего кода явной.