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)!)