Actuellement, j'utilise HttpClient
, HttpPost
pour envoyer des données à mon PHP server
d'un Android app
mais toutes ces méthodes ont été dépréciées dans l'API 22 et supprimées dans l'API 23, alors quelles sont les options alternatives?
J'ai cherché partout mais je n'ai rien trouvé.
La documentation HttpClient vous indique la bonne direction:
org.Apache.http.client.HttpClient
:
Cette interface est obsolète au niveau de l'API 22. Veuillez utiliser openConnection () à la place. Veuillez visiter cette page Web pour plus de détails.
signifie que vous devez passer à Java.net.URL.openConnection()
.
Voici comment vous pouvez le faire:
URL url = new 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);
IOUtils
documentation: Apache Commons IOIOUtils
Dépendance Maven: http://search.maven.org/#artifactdetails|org.Apache.commons|commons-io|1.3.2|jar
J'ai également rencontré ce problème pour résoudre que j'ai créé ma propre classe. Qui est basé sur Java.net et prend en charge jusqu'à l'API d'Android 24, veuillez le vérifier: HttpRequest.Java
En utilisant cette classe, vous pouvez facilement:
GET
POST
PUT
DELETE
HTTP status code
HTTP Headers
Personnalisé à la demande (à l'aide de varargs)String
à la demandeHashMap
{clé = valeur}String
JSONObject
byte []
Tableau d'octets (utile pour les fichiers)et toute combinaison de ceux-ci - juste avec une seule ligne de code)
Voici quelques exemples:
//Consider next request:
HttpRequest req=new HttpRequest("http://Host:port/path");
Exemple 1 :
//prepare Http Post request and send to "http://Host:port/path" with data params name=Bubu and age=29, return true - if worked
req.prepare(HttpRequest.Method.POST).withData("name=Bubu&age=29").send();
Exemple 2 :
// prepare http get request, send to "http://Host:port/path" and read server's response as String
req.prepare().sendAndReadString();
Exemple 3 :
// prepare Http Post request and send to "http://Host:port/path" with data params name=Bubu and age=29 and read server's response as JSONObject
HashMap<String, String>params=new HashMap<>();
params.put("name", "Groot");
params.put("age", "29");
req.prepare(HttpRequest.Method.POST).withData(params).sendAndReadJSON();
Exemple 4 :
//send Http Post request to "http://url.com/b.c" in background using AsyncTask
new AsyncTask<Void, Void, String>(){
protected String doInBackground(Void[] params) {
String response="";
try {
response=new HttpRequest("http://url.com/b.c").prepare(HttpRequest.Method.POST).sendAndReadString();
} catch (Exception e) {
response=e.getMessage();
}
return response;
}
protected void onPostExecute(String result) {
//do something with response
}
}.execute();
Exemple 5 :
//Send Http PUT request to: "http://some.url" with request header:
String json="{\"name\":\"Deadpool\",\"age\":40}";//JSON that we need to send
String url="http://some.url";//URL address where we need to send it
HttpRequest req=new HttpRequest(url);//HttpRequest to url: "http://some.url"
req.withHeaders("Content-Type: application/json");//add request header: "Content-Type: application/json"
req.prepare(HttpRequest.Method.PUT);//Set HttpRequest method as PUT
req.withData(json);//Add json data to request body
JSONObject res=req.sendAndReadJSON();//Accept response as JSONObject
Exemple 6 :
//Equivalent to previous example, but in a shorter way (using methods chaining):
String json="{\"name\":\"Deadpool\",\"age\":40}";//JSON that we need to send
String url="http://some.url";//URL address where we need to send it
//Shortcut for example 5 complex request sending & reading response in one (chained) line
JSONObject res=new HttpRequest(url).withHeaders("Content-Type: application/json").prepare(HttpRequest.Method.PUT).withData(json).sendAndReadJSON();
Exemple 7 :
//Downloading file
byte [] file = new HttpRequest("http://some.file.url").prepare().sendAndReadBytes();
FileOutputStream fos = new FileOutputStream("smile.png");
fos.write(file);
fos.close();
Le code suivant se trouve dans une AsyncTask:
Dans mon processus de fond:
String POST_PARAMS = "param1=" + params[0] + "¶m2=" + params[1];
URL obj = null;
HttpURLConnection con = null;
try {
obj = new URL(Config.YOUR_SERVER_URL);
con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
// For POST only - BEGIN
con.setDoOutput(true);
OutputStream os = con.getOutputStream();
os.write(POST_PARAMS.getBytes());
os.flush();
os.close();
// For POST only - END
int responseCode = con.getResponseCode();
Log.i(TAG, "POST Response Code :: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { //success
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// print result
Log.i(TAG, response.toString());
} else {
Log.i(TAG, "POST request did not work.");
}
} catch (IOException e) {
e.printStackTrace();
}
Référence: http://www.journaldev.com/7148/Java-httpurlconnection-example-to-send-http-getpost-requests
C'est la solution que j'ai appliquée au problème que httpclient a déconseillé dans cette version de Android 22`
public static final String USER_AGENT = "Mozilla/5.0";
public static String sendPost(String _url,Map<String,String> parameter) {
StringBuilder params=new StringBuilder("");
String result="";
try {
for(String s:parameter.keySet()){
params.append("&"+s+"=");
params.append(URLEncoder.encode(parameter.get(s),"UTF-8"));
}
String url =_url;
URL obj = new URL(_url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Accept-Language", "UTF-8");
con.setDoOutput(true);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(con.getOutputStream());
outputStreamWriter.write(params.toString());
outputStreamWriter.flush();
int responseCode = con.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + params);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine + "\n");
}
in.close();
result = response.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally {
return result;
}
}
Vous êtes libre de continuer à utiliser HttpClient. Google a déprécié uniquement sa propre version des composants d'Apache. Vous pouvez installer une version fraîche, puissante et non obsolète du HttpClient d'Apache comme je l'ai décrit dans cet article: https://stackoverflow.com/a/37623038/1727132
Quel client est le meilleur?
Le client HTTP Apache a moins de bugs sur Eclair et Froyo. C'est le meilleur choix pour ces versions.
Pour Gingerbread et mieux, HttpURLConnection est le meilleur choix. Son API simple et sa petite taille le rendent idéal pour Android ...
Référence ici pour plus d'informations (blog des développeurs Android)
Vous pouvez utiliser ma classe personnalisée facile à utiliser. Créez simplement un objet de la classe abstraite (Anonymous) et définissez la méthode onsuccess () et onfail (). https://github.com/creativo123/POSTConnection
si ciblé pour l'API 22 et les versions antérieures, vous devez ajouter la ligne suivante dans build.gradle
dependencies {
compile group: 'org.Apache.httpcomponents' , name: 'httpclient-Android' , version: '4.3.5.1'
}
si ciblé pour l'API 23 et versions ultérieures, vous devez ajouter la ligne suivante dans build.gradle
dependencies {
compile group: 'cz.msebera.Android' , name: 'httpclient', version: '4.4.1.1'
}
Si vous souhaitez toujours utiliser la bibliothèque httpclient, dans Android Marshmallow (sdk 23), vous pouvez ajouter:
useLibrary 'org.Apache.http.legacy'
pour construire.gradle dans la section Android {} comme solution de contournement. Cela semble être nécessaire pour certaines des bibliothèques gms de Google!