如何通过 Swift URLSession 使用 cURL 请求
How to use cURL requests with Swift URLSession
我有一个看起来像这样的请求:
curl --header "token: YOUR TOKEN HERE" --data "a=new_session" site url
我理解并可以通过终端使用它,但我正在尝试使用 Swift 并且在理解如何传递参数和发出请求时遇到一些问题。
我尝试过的:
guard let url = URL(string: siteURL) else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue(token, forHTTPHeaderField: "token")
request.addValue("new_session", forHTTPHeaderField: "a")
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard error == nil else { print(error!.localizedDescription); return }
guard let data = data else { print("Empty data"); return }
if let str = String(data: data, encoding: .utf8) {
print(str)
}
}.resume()
这似乎行不通,我对所有这些网络东西都很陌生,我什至不知道为什么我们在“:”之后传递令牌,在“=”之后传递 new_session所以我将不胜感激!
您的解决方案几乎是正确的。您只是错误地转换了 curl 请求中的 --data
标志。您的数据格式是表单编码的,因为它具有 key=value
的格式。因此,您只需将表单编码数据(在本例中为 a=new_session
)添加到 HTTP 请求的 body 而不是 header。另外,请确保设置正确的内容类型。
看起来像这样:
func makeRequest(siteURL: String, token: String) {
guard let url = URL(string: siteURL) else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue(token, forHTTPHeaderField: "token")
// These two lines are what you were missing.
request.httpBody = "a=new_session".data(using: .utf8)!
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
URLSession.shared.dataTask(with: request) { (data, response, error) in
// handle the request
}.resume()
}
URLSession
请求和 curl
请求现在应该是等价的。
我有一个看起来像这样的请求:
curl --header "token: YOUR TOKEN HERE" --data "a=new_session" site url
我理解并可以通过终端使用它,但我正在尝试使用 Swift 并且在理解如何传递参数和发出请求时遇到一些问题。
我尝试过的:
guard let url = URL(string: siteURL) else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue(token, forHTTPHeaderField: "token")
request.addValue("new_session", forHTTPHeaderField: "a")
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard error == nil else { print(error!.localizedDescription); return }
guard let data = data else { print("Empty data"); return }
if let str = String(data: data, encoding: .utf8) {
print(str)
}
}.resume()
这似乎行不通,我对所有这些网络东西都很陌生,我什至不知道为什么我们在“:”之后传递令牌,在“=”之后传递 new_session所以我将不胜感激!
您的解决方案几乎是正确的。您只是错误地转换了 curl 请求中的 --data
标志。您的数据格式是表单编码的,因为它具有 key=value
的格式。因此,您只需将表单编码数据(在本例中为 a=new_session
)添加到 HTTP 请求的 body 而不是 header。另外,请确保设置正确的内容类型。
看起来像这样:
func makeRequest(siteURL: String, token: String) {
guard let url = URL(string: siteURL) else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue(token, forHTTPHeaderField: "token")
// These two lines are what you were missing.
request.httpBody = "a=new_session".data(using: .utf8)!
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
URLSession.shared.dataTask(with: request) { (data, response, error) in
// handle the request
}.resume()
}
URLSession
请求和 curl
请求现在应该是等价的。