代码之家  ›  专栏  ›  技术社区  ›  Yuma Technical Inc.

在swift中发送get/put/post

  •  0
  • Yuma Technical Inc.  · 技术社区  · 7 年前

    我可以轻松发出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没有问题。(注:以上内容已简化和修改。)

    同样,当我使用如下参数时,我可以发出POST请求并返回(如预期的)JSON数据 key1=value1&key2=value2 (我读到默认帖子 Content-Type application/x-www-form-urlencoded .)

    然而,在另一个应用程序中,我需要发布一段XML。在多次尝试并出现许多错误后,我使用的方法是:设置标题 内容类型 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发送参数吗?

    标题(如 内容类型 )我需要吗?

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

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

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

    对于PUT请求:

    标题(如 内容类型 )我需要吗?

    什么结构(例如。 xml=<?xml …)和编码(例如。 添加百分比编码 )我需要吗?

    因为我已经尝试了很多方法,所以一个PUT和POST的例子将是理想的。

    1 回复  |  直到 7 年前
        1
  •  0
  •   a.masri    7 年前

    如果要发送的数据 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
    
                }