Android 已弃用 apache 模块(HttpClient、HttpResponse 等)

Posted

技术标签:

【中文标题】Android 已弃用 apache 模块(HttpClient、HttpResponse 等)【英文标题】:Android deprecated apache module (HttpClient, HttpResponse, etc.) 【发布时间】:2015-03-27 06:19:58 【问题描述】:

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

但是,例如,HttpGet 是可以的,因为它在 Apache 中称为 HttpGetHC4

【问题讨论】:

只需阅读文档并查看 apache 链接上的示例应用程序。命名空间发生冲突的地方你看到后缀=HC4 查看此信息以获得完整的详细信息,最好的解释***.com/questions/2793150/… 【参考方案1】:

方法 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;

我希望这对某人有所帮助。

【讨论】:

我做了同样的事情,但问题是它没有读取 JSON OBJECT 的左括号,这是一行中唯一的字符。例如:name 会被正确读取,但是 new line name(在这种情况下,左括号不会被正确读取)【参考方案2】:

使用 Apache 的模块并没有什么不好。谷歌只是把它弄得一团糟,因为他们没有成功地进行分叉。 Google 和 Apache 的集成由 Jesse Wilson 监督——他在 Google 工作,搞砸了一切,然后在工作期间建立了自己的库 (OkHttp)。这真是一个丑陋的故事。

我建议不要使用旧版 JAR 文件,因为它包含旧版本的 Apache 库,没有改进和错误修复(它是 very old pre-BETA snapshot)。正如您在 Apache 组件的official page 上看到的那样,有一个全新的 4.4 版本,兼容所有 Android 版本。它只需要在不同的命名空间下重新打包以避免与旧版本冲突。

您只需添加来自Maven(或download release from GitHub)的依赖项:

dependencies 
    compile "cz.msebera.android:httpclient:4.4.1.2"

然后将org.apache.http 替换为cz.msebera.android.httpclient,这样您的导入将如下所示:

import cz.msebera.android.httpclient.Header;
import cz.msebera.android.httpclient.HttpHost;
import cz.msebera.android.httpclient.HttpResponse;

是的,您可以继续使用 Apache 库,而无需浪费数小时重写工作代码!

至于使用 Apache 组件和 HttpURLConnection 的区别,HttpURLConnection 使用响应缓存……仅此而已。我不确定你是否真的想要它,你也可以自己实现它。

顺便说一句,我尝试了 HttpURLConnection 之类的替代方案 - 这些替代方案甚至与 Apache 的功能和简单性都不相近。

【讨论】:

我在 HttpUrlConnection 上花费了几个小时后更改了实现。你说得对。这甚至不接近 apache 库。谁能解释一下,为什么建议将 msebera 的客户端用于针对 SDK 23 的应用程序,而“官方客户端”仅适用于针对 hc.apache.org/httpcomponents-client-4.5.x/android-port.html)我不完全理解..谢谢 这应该是答案!谢啦!我可以在不破坏我的应用程序的情况下改变一切。不再有弃用的过境点!! :) 很好的答案,解释了我们不应该害怕使用 apache 库的原因。对于网络上的所有警告,我们认为使用它们是一个坏主意,但是在阅读了本文并检查了一些要点之后,您可以节省一天的时间。谢谢! 你拯救了我的一天。这是提供向后兼容性的更好解决方案。只有在大多数用户升级到 Android 5.0+ 之后,我才会考虑使用 okhttp。【参考方案3】:

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

useLibrary 'org.apache.http.legacy'

android 部分中的 build.gradle 作为解决方法。这对于一些 Google 自己的 gms 库来说似乎是必要的!

【讨论】:

我尝试添加这个但我有这个错误:错误:(55,0)未找到Gradle DSL方法:'useLibrary()' 我必须在 buildsrcipt 类路径 'com.android.tools.build:gradle:1.3.1' 中更改我的 gradle 版本。现在有效 不要使用这种方式。它仅适用于 Android 8.0 之前。 Android 8.0+ 强制弃用会导致崩溃的 org.apache.http。我受了很多伤害。 @JoeTse:我们在 Android 9 中遇到了这个问题,但在 release notes 中有一个解决方法 - 请参阅清单更改以允许 HttpClient。另一种选择是使用来自 Apache 或其他人的另一个 HttpClient 构建。【参考方案4】:

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

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

对于 Gingerbread 和更好的,HttpURLConnection 是最佳选择。

Reference

使用OKHttp 或HttpUrlConnection。而且我建议不要使用 Apache 库,因为它可能对 Android 效率不高。

【讨论】:

有没有很好的文档或博客介绍从 Apache http 到 URL 连接的移植?【参考方案5】:

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

在你的 build.gradle 中,添加这一行:

dependencies 
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'

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

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'
    


【讨论】:

【参考方案6】:

将此添加到您的应用程序的依赖项中,然后它将正常工作:

dependencies 
...
  compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'

【讨论】:

【参考方案7】:

如果还想使用 httpclient 库,你应该在 build.gradle 文件中添加一些描述。而且似乎添加到 build.gradle 文件中的内容是由构建的目标 Android 项目决定的。

如果针对 API22 及更早版本,则应在 build.gradle 中添加以下行

dependencies 
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'

如果针对 API23 及更高版本,则应在 build.gradle 中添加以下行

dependencies 
    compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1'

这里是参考link

【讨论】:

【参考方案8】:

使用 openConnection()。

HttpClient 文档表明了这一点。

参考this的答案。

【讨论】:

以上是关于Android 已弃用 apache 模块(HttpClient、HttpResponse 等)的主要内容,如果未能解决你的问题,请参考以下文章

AndroidHttpClient 和 HttpGet API 在 Android 6.0 Marshmallow (API 23) 中已弃用

替代Apache Camel中已弃用的XmlJsonDataFormat

Android 位置已弃用?

startIntentSenderForResult 已弃用 Android

处理已弃用的 android.text.ClipboardManager

Android getAllNetworkInfo() 已弃用。啥是替代方案?