现在在 Android 上 HttpEntity 已经被弃用了,有什么替代方法?

45
随着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这样的类有什么替代方案呢?我用自己实现的Android的Pair<T,S>类替换了BasicNameValuePair,而且看起来URLEncoder.encodeURLEncodedUtils的不错替代品,但我不确定该怎么处理HttpEntity
编辑
我决定重新编写网络相关的内容。尝试使用 Retrofit 和 OkHttp。
编辑
认真看看将您的调用和其他内容切换到 Retrofit。非常聪明。我很高兴我这样做了。虽然有一些障碍,但很酷。

如果以下任何答案对您有所帮助,您应该强调最有用的答案。 - C0D3LIC1OU5
使用 OkHttp 是明智的选择。 - Nikola Despotoski
HttpUrlConnection是新的标准(无需外部库)方法来实现它。请参见此答案以获得一个良好的实现json接口的示例。如果不需要,可以相对容易地剥离json。我曾经花费了很长时间来让Retrofit与Proguard配合工作,但最终放弃了。 - Matthew Grivich
3个回答

21

您始终可以导入最新的Apache Http客户端并使用它。此外,您可能还想查看像VolleyRetrofit这样的网络库,以防您可以使用它们代替。如果要启动新项目,则建议使用网络库,因为无需重新发明轮子。但是,如果您只能使用HttpClient,那么请继续阅读。

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

Google Android 1.0发布时带有预发布版本的Apache HttpClient。为了与第一个Android发布相一致,必须过早地冻结Apache HttpClient 4.0 API,而许多接口和内部结构仍未完全解决。随着Apache HttpClient 4.0的成熟,该项目期望Google将最新的代码改进纳入其代码树中。不幸的是,这没有发生。随Android一起提供的Apache HttpClient版本实际上已经变成了一个分支。最终,Google决定停止进一步开发他们的分支,同时拒绝升级到Apache HttpClient的原始版本,并以兼容性问题为拒绝升级的理由。因此,那些想在Android上继续使用Apache HttpClient API的开发人员无法利用较新的功能、性能改进和错误修复。 Apache HttpClient 4.3适用于Android是旨在通过提供与Google Android兼容的官方发布来解决这种情况的。

但是,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及更高版本 应该使用由Marek Sebera维护的Android Apache HttpClient包

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

Apache.org获取的信息


1
因为这对我不是很明显:您还需要将“import org.apache.http.whatever”更改为“import cz.msebera.android.httpclient.whatever”。 - Timmmm
似乎 'cz.msebera.android' 的 httpclient 现在也已经被弃用了?当尝试构建 APK 时,Android Studio 失败并警告 httpclient 现在与 Android 提供的类发生冲突。 - Nom1fan

12

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也能提供服务了?!;-) - Draško Kokić
2
如果您阅读此URL。 http://android-developers.blogspot.in/2011/09/androids-http-clients.html哪个客户端最好? Apache HTTP客户端在Eclair和Froyo上有较少的错误。这是这些版本的最佳选择。对于Gingerbread及更高版本,HttpURLConnection是最佳选择。它的简单API和小尺寸使其非常适合Android。透明压缩和响应缓存减少了网络使用,提高了速度并节省了电池电量。新应用程序应使用HttpURLConnection;这是我们未来将要投入精力的地方。 - hims_3009

2

使用HttpURLConnection替换HttpClient调用web服务

我的代码如下:

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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接