如何从Swift 3获得MS翻译器访问令牌?

我正在尝试使用Swift 3的MS Translator API(目前在操场上玩,但目标平台是iOS)。 但是,当我试图获取OAuth2的访问令牌时,我陷入了困境。 我有以下代码(我试图移植来自示例的代码获取访问令牌 ):

let clientId = "id".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! let clientSecret = "secret".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! let scope = "http://api.microsofttranslator.com".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! let translatorAccessURI = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13" let requestDetails = "grant_type=client_credentials&client_id=\(clientId)&client_secret=\(clientSecret)&scope=\(scope)" let postData = requestDetails.data(using: .ascii)! let postLength = postData.count var request = URLRequest(url: URL(string: translatorAccessURI)!) request.httpMethod = "POST" request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.setValue("\(postLength)", forHTTPHeaderField: "Content-Length") request.httpBody = postData URLSession.shared.dataTask(with: webRequest) { (returnedData, response, error) in let data = String(data: returnedData!, encoding: .ascii) print(data) print("**************") print(response) print("**************") print(error) }.resume() 

当然,我使用了一个有效的clientId和一个有效的clientSecret。

现在callback打印下面的信息。 首先,返回的数据包含一条消息,表明请求是无效的,还有一条消息:

 "ACS90004: The request is not properly formatted." 

其次,响应带有400个代码(这符合请求格式不正确的事实)。

第三,错误是零。

现在我正在使用Postmantesting调用,并且当我使用相同的URI,并将requestDetailsstring作为原始主体消息(我手动添加了Content-Type头)时,我得到了相同的响应。 但是,当我将邮递员用户界面中的主体types更改为application/x-www-form-urlencoded并通过其用户界面作为键值对input请求详细信息时,调用成功。 现在看来,我做了错误的消息格式,或者甚至可能是糟糕的Swift URLRequest / URLSession API,但是,我不能坚持什么。 有人可以帮我吗? 谢谢。

好吧,所以经过一些更绝望的谷歌search和实验,我发现我的错误。 为了后代:

问题在于编码参数在PUT http请求的主体中。 代替:

 let scope = "http://api.microsofttranslator.com" .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! 

我必须使用以下内容:

 let scope = "http://api.microsofttranslator.com" .addingPercentEncoding(withAllowedCharacters: CharacterSet(charactersIn: ";/?:@&=$+{}<>,").inverted)! 

似乎API(或HTTP协议,我不是这方面的专家)在请求正文中的/:字符有问题。 我必须赞扬Studiosus对Polyglot问题报告的回答。