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
startIntentSenderForResult 已弃用 Android