HttpEntity 现在在 Android 上已被弃用,还有啥替代方案?

Posted

技术标签:

【中文标题】HttpEntity 现在在 Android 上已被弃用,还有啥替代方案?【英文标题】:HttpEntity is deprecated on Android now, what's the alternative?HttpEntity 现在在 Android 上已被弃用,还有什么替代方案? 【发布时间】:2015-03-19 16:37:16 【问题描述】:

随着 android 5.1 的发布,所有 Apache http 的东西似乎都已被弃用。看文档是没用的;他们都说

This class was deprecated in API level 22. Please use openConnection() instead. Please visit this webpage for further details.

第一次阅读时这很好,但是当每个已弃用的课程都这么说时,它就没有那么有用了。

不管怎样,HttpEntity 等类的替代方案是什么,特别是 StringEntityMultipartEntity 我用 BasicNameValuePair 替换了我自己实现的 Android 的 Pair<T, S> 类,以及看起来URLEncoder.encode 可以很好地替代URLEncodedUtils,但我不确定如何处理HttpEntity

编辑

我决定只重写网络内容。会尝试使用 Retrofit 和 OkHttp

编辑

认真考虑将您的通话和其他内容转换为 Retrofit。很漂亮。我很高兴我做到了。有一些障碍,但很酷。

【问题讨论】:

你可以看看how to switch from HttpClient to HttpUrlConnection 如果以下任何答案对您有所帮助,您应该强调最有帮助的答案。 使用OkHttp 是明智的选择。 HttpUrlConnection 是新的标准(不需要外部库)。请参阅this answer 以获得实现 json 接口的好示例。如果不需要,可以很容易地剥离 json。我在让 Retrofit 与 Proguard 合作的过程中度过了一段糟糕的时光并放弃了。 【参考方案1】:

您始终可以导入最后一个 Apache Http 客户端并使用它。此外,您可能想查看Volley 或Retrofit 之类的网络库,以防万一您可以使用它。如果开始一个新项目,建议使用网络库,因为不需要重新发明***。但是,如果您坚持使用 HttpClient,请继续阅读。

编辑:关于 Apache HttpClient 的最新消息(截至 2015 年 11 月 7 日)

Google Android 1.0 发布时带有 Apache 的预测试版快照 Http客户端。为了配合第一个 Android 版本 Apache HttpClient 4.0 API 不得不提前冻结,而许多 接口和内部结构仍未完全确定。作为 Apache HttpClient 4.0 正在成熟,该项目期待谷歌 将最新的代码改进合并到他们的代码树中。 不幸的是,它没有发生。发布的 Apache HttpClient 版本 与 Android 已有效地成为一个分支。最终谷歌决定 停止进一步开发他们的分叉,同时拒绝 以兼容性为由升级到 Apache HttpClient 的库存版本 担忧作为做出此类决定的原因。结果那些安卓 希望继续使用 Apache HttpClient API 的开发人员 Android 无法利用更新的功能、性能 改进和错误修复。适用于 Android 的 Apache HttpClient 4.3 端口是 旨在通过提供官方版本来纠正这种情况 与谷歌安卓兼容。鉴于 Android API 23 谷歌的 HttpClient 分支已被移除此项目已被 停产了。

但是,Apache HttpClient v4.3 有一个官方的 Android 端口

Android API 22 及更早版本应使用 Apache HttpClient v4.3

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

Android API 23 及更新版本应使用适用于 Android 的 Apache HttpClient 包maintained by Marek Sebera

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

信息取自Apache.org

【讨论】:

因为这对我来说并不明显:您还必须将 import org.apache.http.whatever 更改为 import cz.msebera.android.httpclient.whatever 现在好像'cz.msebera.android' httpclient 也被弃用了?当尝试构建 APK Android Studio 失败并提醒 httpclient 现在与 Android 提供的类冲突【参考方案2】:

HttpClient 文档为您指明了正确的方向:

org.apache.http.client.HttpClient:

此接口在 API 级别 22 中已弃用。 请改用 openConnection()。请访问此网页了解更多详情。

表示你应该切换到java.net.URL.openConnection()

你可以这样做:

java.net.URL url = new java.net.URL("http://some-server");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");

// read the response
System.out.println("Response Code: " + conn.getResponseCode());
InputStream in = new BufferedInputStream(conn.getInputStream());
String response = org.apache.commons.io.IOUtils.toString(in, "UTF-8");
System.out.println(response);

【讨论】:

对于 http 客户端部分,您可能是正确的......对于 http 服务器部分的评论绝对是荒谬的(或者 URL.openConnection 现在也可以服务了吗?!;-) 如果您阅读此 URL。 android-developers.blogspot.in/2011/09/… 哪个客户端最好? Apache HTTP 客户端在 Eclair 和 Froyo 上的错误更少。它是这些版本的最佳选择。 对于 Gingerbread 和更好的版本,HttpURLConnection 是最佳选择。 其简单的 API 和小尺寸使其非常适合 Android。透明压缩和响应缓存可减少网络使用、提高速度并节省电池。新应用程序应该使用 HttpURLConnection;这是我们将在未来花费精力的地方。【参考方案3】:

调用webservice httpclient 替换为httpurlconnection

我的代码在这里

public static String getDataFromUrl(String url) 
        String result = null;
//        System.out.println("URL comes in jsonparser class is:  " + url);
        try 
            URL myurl=new URL(url);
            HttpURLConnection urlConnection = (HttpURLConnection) myurl
                    .openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoInput(true);
            urlConnection.connect();
            InputStream is=urlConnection.getInputStream();
            if (is != null) 
                StringBuilder sb = new StringBuilder();
                String line;
                try 
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(is));
                    while ((line = reader.readLine()) != null) 
                        sb.append(line);
                    
                    reader.close();
                 finally 
                  is.close();
                
                result = sb.toString();
            
        catch (Exception e)
            result=null;
        
        return result;
    

【讨论】:

以上是关于HttpEntity 现在在 Android 上已被弃用,还有啥替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

linux怎么用命令看android手机上已安装应用的名字,包名,版本,图标。比如adb啥的。

如何在屏幕上已触摸的情况下激活 UIGestureRecognizer?

无法访问 Google 云上已部署的 Angular 应用程序

Spring MVC:啥是 HttpEntity? [复制]

如果设备上已连接 WIFI SSID,则检查 wifi 凭据

使用 Volley 和没有 HttpEntity 的工作 POST 多部分请求