web-dev-qa-db-fra.com

Les requêtes HTTP Post utilisant HttpClient prennent 2 secondes, pourquoi?

Mettre à jour: J'ai trouvé la réponse moi-même, voir ci-dessous :-)

Salut,

Je suis en train de coder une application Android qui soumet des choses en arrière-plan à l'aide de HTTP Post et AsyncTask. J'utilise le org.Apache.http.client Package pour cela. J'ai basé mon code sur cet exemple .

Fondamentalement, mon code ressemble à ceci:

public void postData() {
    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://192.168.1.137:8880/form");

    try {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("id", "12345"));
        nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);

    } catch (ClientProtocolException e) {
     Log.e(TAG,e.toString());
    } catch (IOException e) {
     Log.e(TAG,e.toString());
    }
}

Le problème est que le la ligne httpclient.execute (..) prend environ 1,5 à 3 secondeset je ne comprends pas pourquoi. La simple demande d'une page avec HTTP Get prend environ 80 ms, donc le problème ne semble pas être la latence du réseau lui-même.

Le problème ne semble pas être du côté du serveur non plus, j'ai également essayé de poster des données sur http://www.disney.com/ avec des résultats tout aussi lents. Et Firebug affiche un temps de réponse de 1 ms lors du POST de données sur mon serveur localement.

Cela se produit sur l'émulateur et avec mon Nexus One (les deux avec Android 2.2).

Si vous voulez regarder le code complet, je l'ai mis sur GitHub .

C'est juste un programme factice pour faire une publication HTTP en arrière-plan en utilisant AsyncTask sur la pression d'un bouton. C'est ma première Android, et mon premier Java depuis longtemps. Et accessoirement, aussi ma première question sur Stackoverflow ;-)

Des idées pourquoi httpclient.execute (httppost) prend autant de temps?

41
pableu

Très bien, j'ai résolu cela moi-même avec un peu plus d'enquête. Tout ce que j'avais à faire était d'ajouter un paramètre qui définit la version HTTP à 1.1, comme suit:

HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient httpclient = new DefaultHttpClient(params);

J'ai trouvé cela grâce à la très belle classe HttpHelper de and-bookworm et quelques essais et erreurs.

Si je me souviens bien, HTTP 1.0 ouvre une nouvelle connexion TCP pour chaque requête. Cela explique-t-il le délai important?

Une requête HTTP POST demande maintenant entre 50 et 150 ms sur WLAN et quelque chose entre 300 et 500 ms sur 3G.

55
pableu

je ne suis pas sur Android, mais j'ai rencontré exactement le même genre de problème sur la plate-forme Windows avec httpclient 4.0.1, après pas mal de gratter la tête, j'ai trouvé la solution.

HttpParams params = new BasicHttpParams();
//this how tiny it might seems, is actually absoluty needed. otherwise http client lags for 2sec.
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpClient httpClient = new DefaultHttpClient(params);
HttpResponse httpResponse;


HttpPost httpPost = new HttpPost("http://"+server+":"+port+"/");
StringEntity entity = new StringEntity(content, "utf-8");
entity.setContentType("text/plain; charset=utf-8"); 
httpPost.setEntity(entity);

httpResponse=httpClient.execute(httpPost);

String response = IOUtils.toString(httpResponse.getEntity().getContent(),encoding);
httpResponse.getEntity().consumeContent();

httpClient.getConnectionManager().shutdown();
return(response);

je n'ai aucune idée pourquoi la définition des paramètres avec la version HTTP1.1 résout le problème. mais c'est le cas. également encore plus bizarre, le symptôme ne s'est pas affiché lors de l'exécution d'une requête HTTP Get.

de toute façon, j'espère que cela aide certains!

h

6
henri