PC 上的 Android 与 Java:不同的 HttpResponse?

Posted

技术标签:

【中文标题】PC 上的 Android 与 Java:不同的 HttpResponse?【英文标题】:Android vs. Java on PC : Different HttpResponse? 【发布时间】:2011-12-21 10:29:12 【问题描述】:

我在我的 PC(Windows 7 64 位、Eclipse、Java)和 android 虚拟机上运行相同的代码,得到不同的结果。

它是一个小程序,可以将 HttpResponse 完全打印为字符串。

PC 上的结果:

HTTP/1.1 405 方法不允许 [允许:GET,HEAD,日期:星期四,2011 年 11 月 3 日 17:57:22 GMT,内容类型:text/html; charset=UTF-8,服务器:gws,内容长度:11816,X-XSS-Protection:1; mode=block, X-Frame-Options: SAMEORIGIN]

Android 上的结果:

org.apache.http.message.BasicHttpResponse@44ec9da8

我在 PC 上运行的代码是:

HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(
            "http://www.google.com");

    try 
        HttpResponse response = httpclient.execute(httppost);
        System.out.println(response.toString());

在 Android 上:

HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(
            "http://www.google.com");

    try 
        HttpResponse response = httpclient.execute(httppost);
        return response.toString();

我问是因为我写了一个可以在 PC 上运行的应用程序 - 与 HttpResponse 内容一起工作 - 但在 android 上似乎根本没有内容......

谁能解释一下?或者告诉我如何在android上获取响应内容(标题)作为字符串?

【问题讨论】:

您是否在两者上使用相同版本的 httpClient? Andoid 的 httpClient 是一些 4beta... 我强烈建议 nottoString() 方法的输出用于任何实际的程序行为——它只是不可靠。而是从HttpResponse 获取特定部分或将其作为一个整体返回。 【参考方案1】:

您实际上并没有运行相同的代码。

Android's BasicHttpResponse 目前根本没有toString() 方法,并继续调用java.lang.Object.toString() 给你fully.qualified.class.name@hashcode

您的桌面版 HttpClient 很可能有一个类似于 from HttpClient 4.1.3 的 toString():

public String toString() 
    return this.statusline + " " + this.headergroup;

toString() 用于任何非调试/记录目的都不是好的做法——您应该使用实际的get 方法提取正确的信息,或者只返回HttpResponse 本身。

【讨论】:

【参考方案2】:

这是因为 HttpResponse.toString() 在 Android 和 PC 上的实现方式不同(不同的 jvm 和框架组件实现!)。要正确获取 HttpHeaders,我想您需要使用以下内容:

http://developer.android.com/reference/org/apache/http/HttpMessage.html#getAllHeaders%28%29

无论如何,请参阅 javadoc 以供参考。

【讨论】:

这与JVM实现无关,但与HttpClient的实现有关,您仍然对不同的toString()方法是正确的。 但是据我所知,HttpClient 是标准 android 框架的一部分,并且可能与“常规” apache http 组件的实现方式不同。如果您确实需要验证这一点,请查看 android 源代码,可在 ***.com/questions/449763/… 获得 我完全同意你对不同实现的看法,我只是在术语上挑剔:库/框架类不是 VM 的一部分,Android 上根本没有 JVM,只有达尔维克虚拟机 :) 你是绝对正确的 :) jvm != dvm 也不,http 组件是它的一部分。感谢您指出这一点 - 希望我的快速编辑能够清楚地说明这一点。

以上是关于PC 上的 Android 与 Java:不同的 HttpResponse?的主要内容,如果未能解决你的问题,请参考以下文章

Web 应用程序设计在 iphone 和 android/pc 上看起来不同

Android-x86 4.4-r5 发布,PC 上的安卓系统

在Android上运行Java和C程序

如何通过android上的ADB命令通过pc拨打电话?

IM即时通讯开发之Android内存泄漏监控

借助ESP8266 WIFI模块,实现Android手机有人网络调试助手(或Android手机网络调试助手)与PC端串口调试助手互相通信。