Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpEntity is deprecated on Android now, what's the alternative?

With the release of Android 5.1, it looks like all the Apache http stuff has been deprecated. Looking at the documentation is useless; they all say

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

Which is fine the first time you read it, but when EVERY class that was deprecated says that, it's not that helpful.

Anyway, what are the alternatives for classes like HttpEntity, specifically StringEntity, and MultipartEntity? I substituted BasicNameValuePair for my own implementation of Android's Pair<T, S> class, and it looks like URLEncoder.encode is a good substitute for URLEncodedUtils, but I'm not sure what to do about HttpEntity.

EDIT

I've decided just to re-write the networking stuff. Gonna try to use Retrofit and OkHttp

EDIT

Seriously take a look at switching your calls and stuff to Retrofit. Pretty nifty. I'm glad I did. There were a few hurdles, but it's cool.

like image 837
joshkendrick Avatar asked Mar 19 '15 16:03

joshkendrick


2 Answers

You can always import the last Apache Http client and use that. Also, you might want to take a look at a networking library like Volley or Retrofit, just in case you can use that instead. If starting a new project, using a networking library is recommended because there is no need to reinvent the wheel. But if you are stuck with using HttpClient, then read on.

EDIT: Latest news on Apache HttpClient (as of 11/07/2015)

Google Android 1.0 was released with a pre-BETA snapshot of Apache HttpClient. To coincide with the first Android release Apache HttpClient 4.0 APIs had to be frozen prematurely, while many of interfaces and internal structures were still not fully worked out. As Apache HttpClient 4.0 was maturing the project was expecting Google to incorporate the latest code improvements into their code tree. Unfortunately it did not happen. Version of Apache HttpClient shipped with Android has effectively become a fork. Eventually Google decided to discontinue further development of their fork while refusing to upgrade to the stock version of Apache HttpClient citing compatibility concerns as a reason for such decision. As a result those Android developers who would like to continue using Apache HttpClient APIs on Android cannot take advantage of newer features, performance improvements and bug fixes. Apache HttpClient 4.3 port for Android was intended to remedy the situation by providing official releases compatible with Google Android. Given that as of Android API 23 Google's fork of HttpClient has been removed this project has been discontinued.

However, there is an official Android port of the Apache HttpClient v4.3

Android API 22 and older should use the Apache HttpClient v4.3

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

Android API 23 and newer should use Apache HttpClient packages for Android maintained by Marek Sebera

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

Info taken from Apache.org

like image 77
C0D3LIC1OU5 Avatar answered Nov 16 '22 08:11

C0D3LIC1OU5


The HttpClient documentation points you in the right direction:

org.apache.http.client.HttpClient:

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

means that you should switch to java.net.URL.openConnection().

Here's how you could do it:

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);
like image 12
fateddy Avatar answered Nov 16 '22 10:11

fateddy