在swift

时间:2018-05-11 16:47:35

标签: swift xml post get put

我可以轻松发出GET请求,并返回(按预期方式)解码为myDataModel对象的JSON数据:

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。以上内容已经过简化和修改。)

同样,当我使用像key1=value1&key2=value2这样的参数时,我可以发出POST请求并返回(按预期)JSON数据。 (我读到默认的POST Content-Typeapplication/x-www-form-urlencoded。)

但是,在另一个应用程序中,我需要POST一段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)?

另外我需要PUT数据,我有类似的方法。我尝试的响应有错误

  

无法将字符串解析为XML,XML长度:0

对于PUT请求:

我需要哪些标题(如Content-Type)?

我需要什么结构(例如xml=<?xml ...)和编码(例如addingPercentEncoding)?

由于我尝试了很多方法,PUT和POST的例子都是理想的。

1 个答案:

答案 0 :(得分:0)

如果您要发送XML的数据,可以同时PUTPOST

执行此操作

无需确定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

            }