Android API 23 移除的软件包

4

什么是org.apache.http的最佳替代品?

因为在Android API差异报告中指出了这一点。

API 23中已删除的软件包。

org.apache.commons.logging   
org.apache.http  
org.apache.http.auth     
org.apache.http.auth.params  
org.apache.http.client   
org.apache.http.client.entity    
org.apache.http.client.methods   
org.apache.http.client.params    
org.apache.http.client.protocol  
org.apache.http.client.utils     
org.apache.http.conn.params  
org.apache.http.conn.routing     
org.apache.http.conn.util    
org.apache.http.cookie   
org.apache.http.cookie.params    
org.apache.http.entity   
org.apache.http.impl     
org.apache.http.impl.auth    
org.apache.http.impl.client  
org.apache.http.impl.conn    
org.apache.http.impl.conn.tsccm  
org.apache.http.impl.cookie  
org.apache.http.impl.entity  
org.apache.http.impl.io  
org.apache.http.io   
org.apache.http.message  
org.apache.http.protocol     
org.apache.http.util

1
HttpURLConnection 是 SDK 的一部分。如果您不想使用第三方 HTTP 客户端,它是自然的替代品。 - Blackbelt
4个回答

3

如果您要更新项目并希望继续使用Apache HTTP API,则必须在build.gradle文件中声明以下内容: (更多信息请点击此处)

android {
    useLibrary 'org.apache.http.legacy'
}

请注意所使用的Gradle版本,我在gradle-wrapper.properties中使用的是2.6版。

distributionUrl=https\://services.gradle.org/distributions/gradle-2.6-all.zip

1

你是正确的,DefaultHttpClient和AndroidHttpClient这两个网络类都已被弃用。

现在,只有HttpUrlConnection这个类将被用作它们的替代品。Android开发者网站上有一些用法

"开心编码...!!! "


1

正如Blackbelt所说,HttpURLConnection是HTTPClient的默认替代品。如果你在这里(结尾处)检查一下,你会发现他们将会把重点放在这里。

然而,值得一提的是,一些常见的API正在被使用,并且如果你的应用程序的重点不是浏览网页,而只是使用互联网来获取图片、json、文本等,则可以很好地工作。

我推荐Volley。从我的观点来看,它看起来将得到长时间支持,并且由谷歌自己支持。


Volley是否像第三方库一样使用? - Maher Ismaail
@MaherIsmaail 这取决于你的定义。如果:第三方开发者,是指独立于消费者使用的主要产品或平台的硬件或软件开发者,那么不可以,因为Google是其管理员。但是,它是一个“Android开放软件”,因此开发者可以提高其质量,而无需事先通知您。但是,如果您的应用程序正在销售“仅限互联网服务”,那么可以,就像Volley正在做的那样,您不能将其他人的工作作为自己的销售。 - Bonatti

0

经过三天的搜索和阅读关于HttpUrlConnection和CookieManager的资料,我发现有很多关于它的问题,还有更多关于如何发送Cookies的问题。

因此,我为此提供了一个完整的解决方案:

处理Cookies的方法如下:

static CookieManager myCookies = new CookieManager(null, CookiePolicy.ACCEPT_ALL);

final public static void saveCookies(HttpURLConnection connection , Context context) {
Map<String, List<String>> headerFields = connection.getHeaderFields();

List<String> cookiesHeader = null;
try {
    cookiesHeader = headerFields.get("Set-Cookie");
} catch (Exception e) {
    e.printStackTrace();
}

if (cookiesHeader != null && myCookies != null) {
    for (String cookie : cookiesHeader) {
        try {
            cookie = cookie.replace("\"", "");
            myCookies.getCookieStore().add(connection.getURL().toURI(), HttpCookie.parse(cookie).get(0));
            String new_cookie = TextUtils.join(";", myCookies.getCookieStore().getCookies());

            PreferenceManager.getDefaultSharedPreferences(context).edit().putString("cookie", new_cookie).commit();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
}

final public static void loadCookies(HttpURLConnection connection , Context context) {
if (myCookies != null && myCookies.getCookieStore().getCookies().size() > 0) {
    connection.setRequestProperty("Cookie", TextUtils.join(";", myCookies.getCookieStore().getCookies()));
}
else {
    String new_cookie = PreferenceManager.getDefaultSharedPreferences(context).getString("cookie" , "");
    connection.setRequestProperty("Cookie", new_cookie );
}
}

使用 Json 数据进行 Post 请求

  public String  URL_Connectin_Post ( String  endPoint , JSONObject data , Context context )
{
    URL url;
    try {
        url = new URL(baseUrl + endPoint);

        urlConnection = (HttpURLConnection) url.openConnection();
        loadCookies(urlConnection , context);
        urlConnection.setReadTimeout(15000);
        urlConnection.setConnectTimeout(15000);
        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(true);

        /* optional request header */
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("charset", "UTF-8");
        urlConnection.addRequestProperty("Accept-Encoding", "UTF-8");

        /* optional request header  with UTF-8*/
        urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

        /*  use this when you know data length  */
        urlConnection.setFixedLengthStreamingMode(data.toString().getBytes("UTF-8").length);

        /*  use this when you dont  know data length  */
  //      urlConnection.setChunkedStreamingMode(100);

        urlConnection.setUseCaches(true);
        urlConnection.setRequestMethod("POST");
        urlConnection.connect();

        OutputStream os = urlConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8"));
        writer.write(data.toString());
        writer.flush();
        writer.close();
        os.close();

        int responseCode=urlConnection.getResponseCode();
        if (responseCode == HttpsURLConnection.HTTP_OK)
        {
            InputStream in = urlConnection.getInputStream();
            saveCookies(urlConnection , context);
            Result = convertStreamToString(in);

        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return Result;
}

获取请求

    public  String URL_Connectin_Get(String  endPoint , Context context)
{
    URL url;
    try {
        url = new URL(baseUrl + endPoint);

        urlConnection = (HttpURLConnection) url.openConnection();
        loadCookies(urlConnection , context);

        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("charset", "UTF-8");
        urlConnection.addRequestProperty("Accept-Encoding", "UTF-8");
        urlConnection.setDoInput(true);
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();

        int responseCode=urlConnection.getResponseCode();
        if (responseCode == HttpsURLConnection.HTTP_OK) {

            InputStream in = urlConnection.getInputStream();
            if (urlConnection.getContentEncoding() != null && urlConnection.getContentEncoding().contains("gzip")) {
                GZIPInputStream inn = new GZIPInputStream(in);
                saveCookies(urlConnection , context);
            } else {
                saveCookies(urlConnection  , context);
            }
            Result = convertStreamToString(in);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return Result ;
} 

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