2016-10-18 2 views
0

私はSwift 3のMS Translator API(現在は遊び場で遊んでいますが、ターゲットプラットフォームはiOSです)で作業しようとしています。しかし、私はOAuth2のアクセストークンを取得しようとしていたときに立ち往生しました。私は、次のコード(私はObtaining an access tokenでポートに例のコードを試してみました)している:Swift 3からMS Translatorアクセス​​トークンを取得する方法は?

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を使用しました。

ここで、コールバックは以下の情報を出力します。まず、returnedData要求が無効であるとのメッセージが含まれている、次のメッセージと一緒に:

"ACS90004: The request is not properly formatted." 

第二に、応答は、(要求が適切にフォーマットされていないという事実に適合)400のコードが付属しています。

第3に、エラーはnilです。

私は同じURIを使用し、requestDetails文字列を生のボディメッセージ(私は手動でContent-Typeヘッダーを追加しました)として置いて、同じ応答を得ました。しかし、私は郵便配達員のUIの体のタイプをapplication/x-www-form-urlencodedに変更し、UIを介して要求の詳細をキー値のペアとして入力したところ、呼び出しは成功しました。今や、私はメッセージの書式設定や、Swift URLRequest/URLSession APIで何か悪いことをやっているようですが、何を保留にすることはできません。誰かが私を助けてくれますか?ありがとう。

答えて

0

OKだから、もう少し絶望的なグーグルと実験をした後、私は自分の誤りを見つけました。将来の世代向け:

PUT http要求の本体にパラメータをエンコードする際に問題がありました。代わりに:

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

私は、以下を使用する必要があります。

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

は、API(またはHTTPプロトコルが、私はこれの専門家ではないです)ということらしいで/:文字に問題がありますリクエスト本体。私はPolyglot issue reportでStudiosusの答えにクレジットを与える必要があります。

関連する問題