iOS UrlSession.shared.dataTask удаляет символ "+" utf-8 и заменяет его на " "

Я создаю вызов входа в API с использованием данных с x-www-формой. Я создал ПОЧТУ в Почтальоне и получил 200 ответов. Я использовал функцию экспорта Postman для генерации кода OKHTTP для Android и кода NSURL для iOS. Код Android работает нормально, но код iOS получает ответ 401. Я использовал прокси-сервер отладки Чарльза, чтобы посмотреть, что на самом деле отправляется для полезной нагрузки. Для Android имя пользователя правильно представлено как "username=james+jypsee@jypsee.com", но в iOS оно выглядит как "username = james jypsee@jypsee.com". Мой код iOS ниже:

let headers = [
  "accept": "application/json",
  "cache-control": "no-cache",
  "content-type": "application/x-www-form-urlencoded"
]

let postData = NSMutableData(data: "username=james+jypsee@jypsee.com".data(using: .utf8)!)
postData.append("&password=redacted".data(using: .utf8)!)
postData.append("&grant_type=password".data(using: .utf8)!)
postData.append("&client_id=redacted".data(using: .utf8)!)
postData.append("&client_secret=redacted".data(using: .utf8)!)

    let request = NSMutableURLRequest(url: NSURL(string: "https://redacted.com/api/oauth2/token/")! as URL,
                                      cachePolicy: .useProtocolCachePolicy,
                                      timeoutInterval: 10.0)
    request.httpMethod = "POST"
    request.allHTTPHeaderFields = headers
    request.httpBody = postData as Data
    let session = URLSession.shared
    let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
        if (error != nil) {
            print(error)
        } else {
            let httpResponse = response as? HTTPURLResponse
            print(httpResponse)
        }
    })

Когда я прошел через код iOS, оба объекта NSMutableData и Data правильно отображали имя пользователя как "username=james+jypsee@jypsee.com", просто оставляя URLSession.shared в качестве потенциальной причины ошибки. Но я не могу войти в URLSession.shared.dataTask(), потому что это закрытый метод. Любая помощь приветствуется.

1 ответ

Решение

Существует некоторая проблема с кодировкой символов "+". Вы можете попробовать это вместо этого:

let postData = NSMutableData(data: "username=james%2Bjypsee@jypsee.com".data(using: .utf8)!) 
Другие вопросы по тегам