使用Swift URLSession将标头传递到URL

3xiyfsfu  于 2023-03-07  发布在  Swift
关注(0)|答案(2)|浏览(202)

我不想分享实际的链接,因为它可能有一些私人信息,所以不要感到惊讶,如果它不工作。
我有一个链接,看起来像这样:www.somelink.com/stuff/searchmembers?member=John
还有一些需要传递的头文件,比如Login: Admin, Password: Admin
当我使用this site时,一切似乎都很好,我把链接,使其GET,并把标题放在键:值格式中,结果我得到了所有成员的列表,但我怎么能对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()
}
vshtjzan

vshtjzan1#

问题是:

member=John是人们通常所指的“URL查询参数”。通常,URL请求将查询参数作为URL字符串本身的一部分,而不是请求的httpbody

快速和不干净的解决方案:

简单移除
request.httpBody = "member=John".data(using: .utf8)!
并将整个"www.somelink.com/stuff/searchmembers?member=John"传递到getAllMembers(urlString:)函数中就可以了。

更好的解决方案:

假设John的用户名是j o h n,您的函数将无法通过第一个guard,因为空格不是有效的URL字符串字符。
我喜欢使用URLComponents,因为它省去了处理空格之类的麻烦。
下面是我编写函数的方法:

func getJohnMember(urlString: String) {

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

    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()
}

为了清楚起见,我将把"www.somelink.com/stuff/searchmembers"传递给这个函数的第一个参数urlString
如果我在guard let之后访问print(url),我会得到
www.somelink.com/stuff/searchmembers?member=j%20o%20h%20n
其如人们所期望的那样工作。

hc2pp10m

hc2pp10m2#

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()
}

相关问题