2017-06-09 7 views
1

私はOAuth2.0 APIを使用しています。私のcURLコマンドラインではうまく動作しますが、スワイプコードではうまく動作しません。cURLコマンドラインをSwiftに変換するcURLは機能しません

私はこれらの他のStackOverflowの投稿を読んだが、うまくいかなかった:firstsecondcurl -X POST --data "grant_type=client_credentials&client_id=MY_CLIENT_ID&client_secret=MY_CLIENT_SECRET" https://api.myapp.fr/oauth/token

と私のSWIFTコードは次のとおりです:

実は、私のcurlコマンドがある最初のケースで

 var dataStr: String! 
     let request = NSMutableURLRequest(url: NSURL(string: "https://api.myapp.fr/oauth/token")! as URL) 

     let session = URLSession.shared 
     request.httpMethod = "POST" 

     request.setValue("plain/text", forHTTPHeaderField: "Content-Type") 

     let params = ["grant_type" : "client_credentials", 
         "client_id" : "MY_CLIENT_ID", 
         "client_secret" : "MY_CLIENT_SECRET"] as Dictionary<String, String> 
     let httpData = NSKeyedArchiver.archivedData(withRootObject: params) 
     request.httpBody = httpData 

     let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in 

      dataStr = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) as String! 
      print("Data -> ") 
      print(dataStr) 
     }) 

     task.resume() 

は、要求がうまくフォーマットされ、かつ迅速にそうではありません。 どうしたのですか?あなたのAPIのような

おかげ

+0

まず、ネイティブのSwift構造体(URLRequest、URL、String)を使用し、可能性のあるオプションに対して強制アンラッピングを使用しないでくださいnil(完了ハンドラのデータなど)。バックエンドからどんなエラーが出ていますか? –

+0

私のバックエンドは、要求の形式が正しくないことだけを知っています。 – LeCintas

+0

あなたの質問には、期待しているリクエストの本文と実際のリクエストの本文を含めてください。また、cURLリクエストにContent-Typeヘッダーがない場合、なぜContent-typeをplain/textに設定していますか? –

答えて

2

ルックは、体内のkey=valueスタイルを期待しています。これを試してください:

let url = URL(string: "https://api.myapp.fr/oauth/token")! 
let params = [ 
    "grant_type" : "client_credentials", 
    "client_id" : "MY_CLIENT_ID", 
    "client_secret" : "MY_CLIENT_SECRET" 
] 
let paramString = params.map {"\($0)=\($1)"}.joined(separator: "&") // for clarity and debugging 

var request = URLRequest(url: url) 
request.httpMethod = "POST" 
request.httpBody = paramString.data(using: .utf8) 

URLSession.shared.dataTask(with: request) { data, response, error in 
    guard let data = data else { 
     print("empty data") 
     return 
    } 

    let dataString = String(data: data, encoding: .utf8) 
    print(dataString) 
}.resume() 

これは明らかに特殊文字エンコーディングを処理しません。たとえば、MY_CLIENT_SECRET=または&という記号が含まれている場合、非常に異なる解釈が行われます。

関連する問題