2017-10-16 84 views
1

我使用x-www-form-endoded数据创建了一个到API的登录调用。我在Postman中创建了一个POST,并收到了200个响应。我使用Postman的导出函数为iOS和iOS的NSURL代码生成OKHTTP代码。 Android代码工作正常,但iOS代码收到401响应。我使用Charles Web调试代理来查看实际发送的有效内容的内容。对于android用户名正确表示为“[email protected]”,但在iOS中它出现为“username = james [email protected]”。我的iOS的代码如下:iOS UrlSession.shared.dataTask删除utf-8“+”字符并将其替换为“”

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

let postData = NSMutableData(data: "[email protected]".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和数据对象正确显示的用户名是“[email protected]”,只留下URLSession.shared为错误的潜在原因。但是我不能进入URLSession.shared.dataTask(),因为它是一个私有方法。任何帮助表示赞赏。

回答

1

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

let postData = NSMutableData(data: "username=james%[email protected]".data(using: .utf8)!) 
+1

@JamesJordanTaylor:我想空间也有问题。事实上,如果您的服务器接受JSON类型,那么最好使用NSJSONSerialization从json创建数据对象,并将其传递给服务器,而不是在字符串上使用utf8。 –

+0

真正的问题是您忘记设置Content-Type标题。正文数据的处理没有定义。提供给iOS的默认内容类型时,您的服务器可能会为您解码。 – dgatwood

相关问题