Я могу легко выполнить запрос GET, и он возвращает (как и ожидалось) данные JSON, которые декодируются в объект myDataModel:
class func getData(completionHandler: @escaping (myDataModel?, Error?) -> Void)
{
let url = "https://example.com/api/someResource?ws_key=ABC...XYZ"
if let myUrl = URL(string: url)
{
URLSession.shared.dataTask(with: myUrl)
{
(data, response, err) in
if let data = data
{
do
{
let result = try JSONDecoder().decode(myDataModel.self, from: data)
completionHandler(result, nil)
}
catch let JSONerr
{
completionHandler(nil, JSONerr)
}
}
}.resume()
}
}
Это отлично работает, поэтому GET не проблема. (PS. Выше было упрощено и изменено.)
Аналогично, я могу выдать запрос POST, и он возвращает (как и ожидалось) данные JSON, когда я использую такие параметры, как key1=value1&key2=value2
. (Я читал, что POST Content-Type
по умолчанию application/x-www-form-urlencoded
.)
Однако в другом приложении мне нужно ПОСТУПАТЬ кусок XML. После многих попыток и получения множества ошибок я использую следующий подход: установите заголовок Content-Type
в text/xml; charset=utf-8
; Нет параметров и отправьте XML в качестве тела запроса. Я использую изысканный метод:
PostHTTP(url: "https://example.com/api/someResource?ws_key=ABC...XYZ",
parameters: nil,
headers: ["Content-Type": "text/xml; charset=utf-8", "Content-Length": "\(xml.count)"],
body: "\(xml)") { (result) in ... }
(Я представляю, что вы можете определить, что происходит за кулисами.)
Для запроса POST, чтобы отправить кусок XML:
Нужно ли устанавливать Content-Length
или это автоматически?
Могу ли я отправить параметры с XML?
Какие заголовки (например, Content-Type
) мне нужны?
Какая структура (например, xml=<?xml
...) и кодировка (например, addingPercentEncoding
) мне требуется?
Также мне нужно положить данные, и у меня есть аналогичный метод. Ответ от моей попытки имеет ошибку
Строка не может быть проанализирована как XML, длина XML: 0
Для запроса PUT:
Какие заголовки (например, Content-Type
) мне нужны?
Какая структура (например, xml=<?xml
...) и кодировка (например, addingPercentEncoding
) мне требуется?
Поскольку я пробовал много способов, идеальным примером будет как PUT, так и POST.