【问题标题】:400 bad request invalid hostname only in android application400 bad request invalid hostname 仅在 android 应用程序中
【发布时间】:2012-09-07 06:55:00
【问题描述】:

我在服务器上部署了一个 asp.net mvc 网站,为其他人提供了一些 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) 确保在服务器 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应用程序不能(在两个完全不同的android手机上测试,android模拟器也有400个无效的主机名)

(7)用IP代替域名http://xx.xx.xx.xx/v1.0/user/current,一切都一样。 (xx.xx.xx.xx代表ip地址)

(8) 检查 IIS 日志,对 /v1.0/user/current 的所有请求都返回 200/401/500,没有 400 结果。

(9) 确保安卓应用有互联网权限(实际上我们已经添加了所有权限)

有没有人知道原因或帮助找到原因?非常感谢,这个问题快把我逼疯了。

【问题讨论】:

  • 服务器日志告诉你什么?
  • @Orlymee:查看我的编辑:列表中的第 (8) 项。
  • 检查你的AndroidManifest,你有<uses-permission android:name="android.permission.INTERNET"/>
  • 在这种情况下,我使用 WireShark 工具 (wireshark.org) 进行调试。如果您有权访问服务器,请尝试嗅探传输的包。或者,如果服务器不可用,则在独立 PC 上的模拟器中运行您的 android 应用并嗅探请求。
  • @TheDimasig:感谢您的回复。我们已添加所有权限。我们还捕获在模拟器中发送的数据。但这真的很难理解。

标签: c# java android asp.net-mvc


【解决方案1】:

应该是httpGet.addHeader("Authorization", "basic " + encoded);String encoded = Base64.encodeToString(token.getBytes(), Base64.NO_WRAP);

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。我可以在调试模式下从 Fiddler 或任何其他工具向我的 asp.net Web API 发送 HTTP POST,但我无法从我的 android 应用程序访问。

    1. 我尝试确保从我的计算机浏览器连接到 Web API 接口。

    2. 我尝试确保从 android 模拟器 web 进行连接
      浏览器(AEWB)。然后我将我的 web api 部署到 IIS,这样我就可以从 AEWB 获取特定的地址。

    我可以从我的 AEWB 访问此地址

    http://10.0.0.2:8088/api/tran
    
    http://10.0.0.2 -> this is your local host address seen from Android
    8088  -> this is your port of web api hosted on IIS
    /api  -> this is web api
    /tran -> this is your controller
    

    【讨论】:

    • 我已经离开了那家公司。但我记得最后我们仍然没有解决这个问题。 Android 开发人员使用另一种解决方案来避免这种情况,但我不知道如何。顺便说一句,您不应该发布“我有同样的问题”作为答案。
    猜你喜欢
    • 2013-02-16
    • 2018-08-22
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2020-11-01
    相关资源
    最近更新 更多