【问题标题】:iOS UrlSession.shared.dataTask removes utf-8 "+" character and replaces it with " "iOS UrlSession.shared.dataTask 移除 utf-8 "+" 字符并用 " " 替换
【发布时间】:2017-10-16 02:33:01
【问题描述】:

我正在使用 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() 因为它是一个私有方法。任何帮助表示赞赏。

【问题讨论】:

    标签: ios utf-8 postman nsurlsession nsurlsessiondatatask


    【解决方案1】:

    “+”字符的编码存在一些问题。你可以试试这个:

    let postData = NSMutableData(data: "username=james%2Bjypsee@jypsee.com".data(using: .utf8)!) 
    

    【讨论】:

    • @JamesJordanTaylor:我猜空间也有问题。事实上,如果您的服务器接受 JSON 类型,最好使用 NSJSONSerialization 从 json 创建数据对象并将其传递给服务器,而不是在字符串上使用 utf8。
    • 真正的问题是您忘记设置 Content-Type 标头。没有它,身体数据的处理是不确定的。当提供任何 iOS 的默认内容类型时,您的服务器可能正在为您进行解码。
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多