Android 4.2 で HttpPost に問題があります。.NET WebAPI サービスでホストされている認証サービスを呼び出そうとしています。
このサービスでは、リクエストが POST メソッドとして作成され、いくつかのカスタム リクエスト ヘッダーが提供される必要があります。リクエストの本文は、Json 値をサービスに送信します。
リクエストの作成方法は次のとおりです。
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://api.fekke.com/api/account/login");
httppost.addHeader(HTTP.TARGET_HOST, "api.fekke.com");
httppost.addHeader("Accept", "application/json");
httppost.addHeader("Fekke-AccessKey", "some-access-key");
httppost.addHeader("Date", dateString);
httppost.addHeader("Fekke-Signature", "some-encoded-value");
httppost.addHeader("Content-Type", "application/json; charset=utf-8");
String jsonmessage = "{\"Username\": \"myusername\", \"Password\": \"mypassword987\"}";
httppost.setEntity(new StringEntity(jsonmessage, HTTP.UTF_8));
HttpResponse response = httpclient.execute(httppost);
「Content-Length」ヘッダーでこれを呼び出そうとしましたが、ヘッダーがリクエストに既に存在するという例外がスローされます。
また、Google がこの時点から使用することを提案している HttpURLConnection オブジェクトを使用してこれを呼び出してみましたが、これも同じ問題に遭遇します。
iOS と .NET から問題なくこのリクエストを呼び出すことができたので、サービスではないことがわかりました。
更新 #1
サービスのローカル バージョンで次の例を実行したところ、http ヘッダーの 1 つでハッシュ値を渡すときにエラーを特定できました。サービスで使用される値を設定するために HMAC SHA-256 ハッシュ アルゴリズムを使用する JWT セキュリティ トークンを使用しています。このハッシュ値により、リクエストの実行が失敗します。
更新 #2
私はついに問題を解決することができました。この問題は、Base64 の encodeToString メソッドが非表示の文字を値に追加したことが原因でした。ヘッダーの破損を強制していました。デフォルト設定の 0 または Base64.DEFAULT を使用していました。値を Base64.NO_WRAP に変更したところ、問題は解決しました。