Как использовать запросы cURL с Swift URLSession - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть запрос, который выглядит следующим образом:

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 после "=", поэтому я буду признателен за любую помощь!

1 Ответ

0 голосов
/ 28 сентября 2019

Ты решение почти правильное.Вы просто неправильно конвертируете флаг --data из запроса curl.Формат ваших данных закодирован в форме, потому что он имеет формат key=value.Так что вам просто нужно добавить закодированные данные формы (в данном случае a=new_session) в тело вашего HTTP-запроса, а не в качестве заголовка.Кроме того, убедитесь, что вы установили правильный тип контента.

Это будет выглядеть примерно так:

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

Запрос URLSession и запрос curl теперь должны быть эквивалентны.

...