使用 Swift URLSession 将标头传递给 URL

Mik*_*ara 6 url nsurlsession swift

我不想分享实际链接,因为它可能有一些私人信息,所以如果它不起作用,请不要感到惊讶。

我有一个看起来像这样的链接: www.somelink.com/stuff/searchmembers?member=John

还有一些我需要传递的标题,比如 Login: Admin, Password: Admin

当我使用这个网站时,一切似乎都很好,我放了链接,把它设为 GET 并把标题放在 key:value 格式中,结果我得到了所有成员的列表,但是我怎么能用 URLSession 做同样的事情? 这是我目前拥有的,我什么也没有得到。我在那里做错了什么?

func getAllMembers(urlString: String) {

    guard let url = URL(string: urlString) else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue("Admin", forHTTPHeaderField: "Login")
    request.setValue("Admin", forHTTPHeaderField: "Password")
    request.httpBody = "member=John".data(using: .utf8)!


    URLSession.shared.dataTask(with: request) { (data, response, error) in
        print(response)
        print(data)
    }.resume()
}
Run Code Online (Sandbox Code Playgroud)

Dáv*_*tor 5

member=John是 URL 查询参数,而不是请求正文的一部分。因此您需要将其添加到 URL 本身。

func getAllMembers(urlString: String) {
    guard let url = URL(string: "\(urlString)?member=John") else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue("Admin", forHTTPHeaderField: "Login")
    request.setValue("Admin", forHTTPHeaderField: "Password")


    URLSession.shared.dataTask(with: request) { (data, response, error) in
        print(response)
        print(data)
    }.resume()
}
Run Code Online (Sandbox Code Playgroud)


Xav*_* L. 5

member=John实际上是一个 URL 查询参数,因此它应该是您的 URL 的一部分,而不是 URLRequest。

您应该使用 URLComponents,因为它会自动对必要的内容进行百分比编码(例如,如果 John 有一个像 一样时髦的用户名member=J%hn怎么办?)(这在过去让我很头疼)。

func getAllMembers(urlString: String) {

    //URLComponents to the rescue!
    var urlBuilder = URLComponents(string: urlString)
    urlBuilder?.queryItems = [
        URLQueryItem(name: "member", value: "John")
    ]

    guard let url = urlBuilder.url else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue("Admin", forHTTPHeaderField: "Login")
    request.setValue("Admin", forHTTPHeaderField: "Password")


    URLSession.shared.dataTask(with: request) { (data, response, error) in
        print(response)
        print(String(data: data, encoding: .utf8)) //Try this too!
    }.resume()
}
Run Code Online (Sandbox Code Playgroud)