用swift发送get/put/post

用swift发送get/put/post,swift,xml,post,get,put,Swift,Xml,Post,Get,Put,我可以很容易地发出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) {

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

类似地,当我使用类似
key1=value1&key2=value2这样的参数时,我可以发出POST请求并返回(如预期的)JSON数据。(我了解到默认的POST
内容类型是
application/x-www-form-urlencoded

然而,在另一个应用程序中,我需要发布一段XML。经过多次尝试并出现许多错误后,我使用的方法是:将标题
Content-Type
设置为
text/xml;字符集=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:

我需要设置
内容长度还是自动设置

我可以用XML发送参数吗

我需要什么标题(如
内容类型


什么结构(例如
xml=如果您想发送
xml
的数据,您可以在
PUT
POST
中执行此操作

它不必确定
内容长度
但您必须添加
内容类型

 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

            }
let req=NSMutableURLRequest(url:url(字符串:“myUrl”)!)
req.httpMethod=“POST”
请求setValue(“应用程序/xml;字符集=utf-8;”,用于HttpHeaderField:“内容类型”)
req.setValue(“application/xml;”,用于httpheaderfield:“Accept”)
var postBody=Data()
如果让anEncoding=(“”)。数据(使用:.utf8){
postBody.append(一个编码)
}
如果让anEncoding=“.data”(使用:.utf8){
postBody.append(一个编码)
}
如果让anEncoding=“\(123)”.data(使用:.utf8){
postBody.append(一个编码)
}
如果让anEncoding=“.data”(使用:.utf8){
postBody.append(一个编码)
}
req.httpBody=postBody
req.setValue(“\(postBody.count)”,用于HttpHeaderField:“内容长度”)
URLSession.shared.dataTask(其中:req作为URLRequest){(data,urlreq,error)在
}

正如你所说,我确保我有这些标题并删除了addPercent…参见原始输出:在图像中很明显,你是使用工具而不是通过代码进行实验的,你能附上你如何放置车身的屏幕截图吗?我已决定不使用任何外部助手库-所有内容都是我自己通过swift编写的代码。这是我的主要方法对于PUT和是我的主要POST方法。每个调用
object2psxml
(屏幕1-和屏幕2-)从我的对象创建XML。然后POST请求通过(屏幕1-和屏幕2-)完成;PUT通过(屏幕1-和屏幕2-)完成。还需要什么?什么工具您认为我在使用吗?是否可以附加您的参数的屏幕截图,您是否首先添加此项
,始终确保将参数作为数据而不是字符串发送,并且
内容长度
计数数据而不是字符串计数不确定您指的是什么。PutHTTP和PostHTTP方法都有零参数,所以uess您指的是httpbody.Method
object2psxml
将对象(myDataModel的实例)转换为XML字符串。(在上述方法中,它被转换为数据-它们具有
.data(使用:.utf8)
,因此它们应该按照您所说的方式进行编码。)但是我已经删除了
内容长度
标题-我应该再次使用它吗?我注意到我在两种方法中都使用string.count,但仅使用参数为零。代码屏幕抓取是否易于阅读?