我不想分享实际的链接,因为它可能有一些私人信息,所以不要感到惊讶,如果它不工作。
我有一个链接,看起来像这样: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()
}
2条答案
按热度按时间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,因为它省去了处理空格之类的麻烦。
下面是我编写函数的方法:
为了清楚起见,我将把
"www.somelink.com/stuff/searchmembers"
传递给这个函数的第一个参数urlString
。如果我在
guard let
之后访问print(url)
,我会得到www.somelink.com/stuff/searchmembers?member=j%20o%20h%20n
其如人们所期望的那样工作。
hc2pp10m2#
member=John
是一个URL查询参数,不是请求正文的一部分,因此需要将其添加到URL本身。