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

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

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

【问题讨论】:

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

标签: android apache apache-commons-httpclient


【解决方案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

使用OKHttpHttpUrlConnection。而且我建议不要使用 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的答案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-06
          • 1970-01-01
          相关资源
          最近更新 更多