Android弃用了apache模块(HttpClient,HttpResponse等)

Evg*_*niy 59 apache android apache-commons-httpclient

自API级别22以来,Android已经弃用了Apache模块,所以我的问题是,我如何使用,例如  HttpResponse来自Apache库,而不是Android SDK?问题是两个包都是一样的.

但是,例如,HttpGet没关系,因为它HttpGetHC4在Apache中被调用.

vin*_*091 41

HttpClient方法已被弃用.您现在可以使用URLConnection,如您在此示例中所示:

private StringBuffer request(String urlString) {
    // TODO Auto-generated method stub

    StringBuffer chaine = new StringBuffer("");
    try{
        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setRequestProperty("User-Agent", "");
        connection.setRequestMethod("POST");
        connection.setDoInput(true);
        connection.connect();

        InputStream inputStream = connection.getInputStream();

        BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream));
        String line = "";
        while ((line = rd.readLine()) != null) {
            chaine.append(line);
        }
    }
    catch (IOException e) {
        // Writing exception to log
        e.printStackTrace();
    }
    return chaine;
}
Run Code Online (Sandbox Code Playgroud)

我希望这能帮助别人.


Jeh*_*lio 27

使用Apache的模块没什么不好的.谷歌刚刚搞砸了,因为他们未能成功实现分叉.谷歌和阿帕奇的整合由杰西威尔逊监督 - 他在谷歌工作,弄乱了所有东西,然后在广场上工作时建立了自己的图书馆(OkHttp).这是一个非常难看的故事.

我建议不要使用遗留JAR文件,因为它包含旧版本的Apache库,没有改进和错误修正(这是一个非常古老的BETA之前的快照).正如您在Apache组件的官方页面上看到的,有一个全新的4.4版本,与所有Android版本兼容.它只需要在不同的命名空间下重新打包,以避免与旧版本冲突.

您只需从Maven添加依赖项(或从GitHub下载发行版):

dependencies {
    compile "cz.msebera.android:httpclient:4.4.1.2"
}
Run Code Online (Sandbox Code Playgroud)

然后替换org.apache.httpcz.msebera.android.httpclient,所以你的导入将如下所示:

import cz.msebera.android.httpclient.Header;
import cz.msebera.android.httpclient.HttpHost;
import cz.msebera.android.httpclient.HttpResponse;
Run Code Online (Sandbox Code Playgroud)

是的,你可以继续使用Apache库而不浪费时间重写工作代码!

至于使用Apache组件和HttpURLConnection之间的区别,HttpURLConnection使用了响应缓存...而这就是全部.我不确定你真的想要它,而且你也可以自己实现它.

顺便说一句,我尝试了像HttpURLConnection这样的替代方案 - 这些方法甚至都不接近Apache的强大功能和简单性.

  • 在 HttpUrlConnection 上花了几个小时后,我更改了实现。你是对的。这甚至不接近 apache 库。谁能解释一下,为什么 msebera 的客户端被推荐用于面向 SDK 23 的应用程序,而“官方客户端”仅适用于面向 <= SDK 22 的设备(请参阅此处:https://hc.apache.org/httpcomponents-client- 4.5.x/android-port.html) 我不完全明白..谢谢 (2认同)
  • 这应该是答案!谢啦!我可以在不破坏应用程序的情况下更改所有内容。不再有过时的交叉口!!:) (2认同)
  • 很好的答案,解释了我们不应该害怕使用 apache 库的原因。对于网络上的所有警告,我们认为使用它们是一个坏主意,但是在阅读本文并检查一些要点后,您就可以节省一天。谢谢! (2认同)

fat*_*ire 22

在Android Marshmallow(sdk 23)中,您可以添加:

useLibrary 'org.apache.http.legacy'

在该android {}部分中build.gradle 作为变通方法.这似乎是谷歌自己的一些gms库所必需的!

  • 我必须在buildsrcipt类路径'com.android.tools.build:gradle:1.3.1'中更改我的gradle版本.现在有效 (3认同)

mml*_*loo 11

如果我是你,我不会使用HttpClient因为:

Apache HTTP客户端在Eclair和Froyo上的错误更少.它是这些版本的最佳选择.

对于姜饼和更好的,HttpURLConnection是最好的选择.

参考

使用OKHttpHttpUrlConnection.而且我也建议不要使用Apache库,因为它可能对Android不高效.


Viv*_*ivi 6

我想你可以直接在项目中使用Apache库,而不是Android附带的那些(你可以通过这种方式获得更多控制 - 如果需要,可以使用旧的SDK版本进行编译).

build.gradle中,添加以下行:

dependencies {
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}
Run Code Online (Sandbox Code Playgroud)

要防止出现警告,请同时添加以下行:

android {

     -- YOUR EXISTING LINES --

     packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    }

}
Run Code Online (Sandbox Code Playgroud)