Передача заголовков на URL с помощью Swift URLSession - PullRequest
1 голос
/ 23 октября 2019

Я не хочу делиться реальной ссылкой, поскольку она может содержать некоторую личную информацию, поэтому не удивляйтесь, если она не работает.

У меня есть ссылка, которая выглядит следующим образом: www.somelink.com/stuff/searchmembers?member=John

И некоторые заголовки, которые мне нужно передать, например Login: Admin, Password: Admin

Когда я использую этот сайт все, кажется, работает просто отлично, я поставил ссылку,сделайте его 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 ]

0 голосов
/ 23 октября 2019

Ваш member=John на самом деле является параметром запроса URL, поэтому он должен быть частью вашего URL, а не URLRequest.

Вы должны использовать URLComponents, потому что он будет автоматически кодировать необходимые вещи в процентах (например,Что, если у Джона странное имя пользователя, например 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()
}
0 голосов
/ 23 октября 2019

То, что 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()
}
...