отправка получить / положить / сообщение в Swift - PullRequest
0 голосов
/ 11 мая 2018

Я могу легко выполнить запрос 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.

1 Ответ

0 голосов
/ 11 мая 2018

Если вы хотите отправить данные XML, вы можете сделать это как PUT, так и POST

Не нужно определять Content-Length Но вы должны добавить Content-Type

 let req = NSMutableURLRequest(url: URL(string:"myUrl")!)
            req.httpMethod = "POST"
            req.setValue("application/xml;charset=utf-8;", forHTTPHeaderField: "Content-Type")
            req.setValue("application/xml;", forHTTPHeaderField: "Accept")
            var postBody = Data()
            if let anEncoding = ("<?xml version='1.0' encoding='UTF-8'?>").data(using: .utf8) {
                postBody.append(anEncoding)
            }
            if let anEncoding = "<Request>".data(using: .utf8) {
                postBody.append(anEncoding)
            }
            if let anEncoding = "<test>\(123)</test>".data(using: .utf8) {
                postBody.append(anEncoding)
            }

            if let anEncoding = "</Request>".data(using: .utf8) {
                postBody.append(anEncoding)
            }
            req.httpBody = postBody

            req.setValue("\(postBody.count)", forHTTPHeaderField: "Content-Length")
            URLSession.shared.dataTask(with: req as URLRequest) { (data, urlreq, error) in

            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...