在 swift 中发送 get / put / post
sending get / put / post in swift
我可以轻松发出 GET 请求,它 returns(正如预期的那样)JSON 解码到 myDataModel object:
的数据
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 请求,它 returns(如预期) JSON 数据。 (我看默认的POSTContent-Type
是application/x-www-form-urlencoded
。)
然而,在另一个应用程序中我需要 POST 一块 XML。经过多次尝试并出现许多错误后,我使用的方法是:将 header Content-Type
设置为 text/xml; charset=utf-8
;没有参数并发送 XML 作为请求 body。我用的是精炼法:
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 发送参数吗?
我需要什么header(如Content-Type
)?
我需要什么结构(例如xml=<?xml
...)和编码(例如addingPercentEncoding
)?
我也需要PUT数据,我有类似的方法。我尝试的响应有错误
String could not be parsed as XML, XML length: 0
对于 PUT 请求:
我需要什么header(如Content-Type
)?
我需要什么结构(例如xml=<?xml
...)和编码(例如addingPercentEncoding
)?
由于我尝试了很多方法,PUT 和 POST 的示例将是理想的。
如果您想发送 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
}
我可以轻松发出 GET 请求,它 returns(正如预期的那样)JSON 解码到 myDataModel object:
的数据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 请求,它 returns(如预期) JSON 数据。 (我看默认的POSTContent-Type
是application/x-www-form-urlencoded
。)
然而,在另一个应用程序中我需要 POST 一块 XML。经过多次尝试并出现许多错误后,我使用的方法是:将 header Content-Type
设置为 text/xml; charset=utf-8
;没有参数并发送 XML 作为请求 body。我用的是精炼法:
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 发送参数吗?
我需要什么header(如Content-Type
)?
我需要什么结构(例如xml=<?xml
...)和编码(例如addingPercentEncoding
)?
我也需要PUT数据,我有类似的方法。我尝试的响应有错误
String could not be parsed as XML, XML length: 0
对于 PUT 请求:
我需要什么header(如Content-Type
)?
我需要什么结构(例如xml=<?xml
...)和编码(例如addingPercentEncoding
)?
由于我尝试了很多方法,PUT 和 POST 的示例将是理想的。
如果您想发送 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
}