[英]iOS UrlSession.shared.dataTask removes utf-8 "+" character and replaces it with " "
我正在使用 x-www-form-endoded 數據創建對 API 的登錄調用。 我在 Postman 中創建了一個 POST 並收到了 200 個響應。 我使用 Postman 的導出功能生成了 Android 的 OKHTTP 代碼和 iOS 的 NSURL 代碼。 Android 代碼運行良好,但 iOS 代碼收到 401 響應。 我使用 Charles Web 調試代理來查看實際為有效負載發送的內容。 對於 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() 因為它是一個私有方法。 任何幫助表示贊賞。
“+”字符的編碼存在一些問題。 你可以試試這個:
let postData = NSMutableData(data: "username=james%2Bjypsee@jypsee.com".data(using: .utf8)!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.