web-dev-qa-db-fra.com

J'ai besoin d'une option alternative à HttpClient dans Android pour envoyer des données à PHP car il n'est plus pris en charge)

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é.

27
priyank

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 IO
IOUtils Dépendance Maven: http://search.maven.org/#artifactdetails|org.Apache.commons|commons-io|1.3.2|jar

28
fateddy

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:

  1. Envoyer une demande Http GET
  2. Envoyer une demande Http POST
  3. Envoyer une demande Http PUT
  4. Envoyer Http DELETE
  5. Envoyer une demande sans paramètres de données supplémentaires et vérifier la réponse HTTP status code
  6. Ajouter un HTTP Headers Personnalisé à la demande (à l'aide de varargs)
  7. Ajouter des paramètres de données en tant que requête String à la demande
  8. Ajouter des paramètres de données en tant que HashMap {clé = valeur}
  9. Accepter la réponse en tant que String
  10. Accepter la réponse en tant que JSONObject
  11. Accepter la réponse comme 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();
41
Nikita Kurtin

Le code suivant se trouve dans une AsyncTask:

Dans mon processus de fond:

String POST_PARAMS = "param1=" + params[0] + "&param2=" + 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

7
Sandy D.

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

}
3
Frutos Marquez

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

2
Jehy

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)

1
Hugo

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

1
Keval Choudhary

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!

1
Hasan Jamshaid