如何通过 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 请求现在应该是等价的。