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()を呼び出すことはできません。どんな助けもありがとうございます。
@ JamesJordanTaylor:スペースに問題があると思います。サーバーがJSON型を受け入れる場合は、NSJSONSerializationを使用してjsonからデータオブジェクトを作成し、文字列でutf8を使用する代わりにサーバーに渡す方が良いです。 –
本当の問題は、Content-Typeヘッダーを設定するのを忘れたことです。ボディデータの処理は、それがなければ定義されていません。 iOSのデフォルトのコンテンツタイプがあれば、あなたのサーバーはおそらくあなたのためにデコードを行っています。 – dgatwood