2017-10-16 5 views
1

x-www-form-endodedデータを使用してAPIへのログイン呼び出しを作成しています。私は郵便配達でPOSTを作成し、200応答を受けました。私はPostmanのエクスポート機能を使ってAndroid用のOKHTTPコードとiOS用のNSURLコードを生成しました。 Androidコードは正常に動作しますが、iOSコードは401応答を受信します。私はチャールズのWebデバッグプロキシを使って実際にペイロードのために送信されたものを見ました。アンドロイドの場合、ユーザー名は「[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とデータの両方が正しく同じようURLSession.sharedを残し、「[email protected]」として名を表示されるオブジェクト潜在的なエラーの原因しかし、私は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

関連する問題