サーバーに asp.net mvc Web サイトをデプロイして、他の Web インターフェイスにいくつかの Web インターフェイスを提供しています。たとえば、現在のユーザーの情報を取得すると、私のテスト C# コンソール アプリケーションは次のようになります。
using (var client = new WebClient())
{
try
{
var url = "http://api.fake.mysite.com/v1.0/user/current";
var token = "e0034e1c082de62b74e361b15f9c6471";
var encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(token));
client.Headers["Authorization"] = encoded;
client.Headers["Content-Type"] = "application/json";
Console.WriteLine(client.DownloadString(url));
}
catch (WebException e)
{
//log the exception
}
}
HTTP_GET 経由で URL をリクエストし、Authorizationヘッダーをエンコードされたトークンに設定するだけです。実際、私のマシンでは問題なく動作します。しかし、AndroidアプリケーションでこのURLにアクセスすると、奇妙な問題に遭遇する人がいます.Javaコードは次のとおりです。
HttpClient httpClient = new DefaultHttpClient();
String token = "e0034e1c082de62b74e361b15f9c6471";
String url = "http://api.fake.mysite.com/v1.0/user/current";
HttpGet httpGet = new HttpGet(url);
String encoded = Base64.encodeToString(token.getBytes(), Base64.DEFAULT);
httpGet.addHeader("Authorization", encoded);
httpGet.addHeader("Content-Type", "application/json");
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
int responseCode = httpResponse.getStatusLine().getStatusCode();
String response = EntityUtils.toString(httpResponse.getEntity());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
その後、「400 bad request invalid host name」エラーが発生しました。私はもう試した:
(1) 変数 "encoded" が C# と Java コードで同じ値であることを確認します。
(2) Web サイトのドメイン名がサーバー IIS で正しく設定されていることを確認します。
(3) すべての PC/携帯電話でテスト インデックス ページ ( http://api.fake.mysite.com )にアクセスできます。
(4) ping api.fake.mysite.com は正常に動作します
(5) を削除するhttpGet.addHeader("Authorization", encoded);
と、Java プログラムは予想どおり 401 Unauthorized の結果を取得しました (私の制御下にあるサーバー コードが結果を返します)。
(6) C# と PHP を使用する他のいくつかのアプリケーションは Web メソッドを適切に使用できますが、Android アプリケーションのみが使用できません (2 つのまったく異なる Android 携帯電話でテストされ、Android エミュレーターも 400 の無効なホスト名を取得しました)。
(7) ドメイン名http://xx.xx.xx.xx/v1.0/user/currentの代わりに IP を使用します。すべて同じです。(xx.xx.xx.xx は IP アドレスを表します)
(8) IIS ログを確認すると、/v1.0/user/current へのすべての要求が 200/401/500 を返し、400 の結果はありません。
(9) Android アプリケーションにインターネット アクセス許可があることを確認します (実際には、すべてのアクセス許可を追加しました)。
誰かが理由を知っているか、理由を見つけるのを手伝ってくれますか? どうもありがとう、この問題は私を夢中にさせています。