HTTP Post запросы с использованием HttpClient занимают 2 секунды, почему? - PullRequest
41 голосов
/ 15 июня 2010
Обновление: Сам нашел ответ, см. Ниже: -)

Привет,

В настоящее время я пишу приложение для Android, которое отправляет данные в фоновом режиме, используяHTTP Post и AsyncTask.Для этого я использую пакет org.apache.http.client .Я основал свой код на этом примере .

По сути, мой код выглядит так:

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

Проблема в том, что httpclient.execute (..) Линия занимает около 1,5–3 секунд , и я не понимаю, почему.Просто запрос страницы с HTTP Get занимает около 80 мс или около того, поэтому проблема не в самой латентности сети.

Проблема, похоже, не на стороне сервера, у меня естьтакже пытался POSTing данных до http://www.disney.com/ с такими же медленными результатами.И Firebug показывает время отклика 1 мс при отправке данных на мой сервер локально.

Это происходит на эмуляторе и с моим Nexus One (оба с Android 2.2).

Если вы хотите посмотреть наполный код, я поместил его на GitHub .

Это просто фиктивная программа для выполнения HTTP Post в фоновом режиме, используя AsyncTask одним нажатием кнопки.Это мое первое приложение для Android и мой первый код на долгое время.Кстати, также мой первый вопрос о Stackoverflow; -)

Есть идеи, почему httpclient.execute (httppost) занимает так много времени?

Ответы [ 2 ]

55 голосов
/ 15 июня 2010

Хорошо, я решил это сам, проведя дополнительное расследование.Все, что мне нужно было сделать, это добавить параметр, который устанавливает версию HTTP на 1.1, следующим образом:

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

Я нашел это благодаря очень хорошему классу HttpHelper от and-bookwormи несколько проб и ошибок.

Если я правильно помню, HTTP 1.0 открывает новое TCP-соединение для каждого запроса.Объясняет ли это большую задержку?

Запрос HTTP POST теперь занимает от 50 до 150 мс по беспроводной сети и от 300 до 500 мс по 3G.

6 голосов
/ 21 января 2011

Я не на Android, но я столкнулся с точно такой же проблемой на платформе Windows с httpclient 4.0.1, после того, как немного почесал голову, я нашел решение.

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

Я понятия не имею, почему установка параметров с версией HTTP1.1 решает проблему. но это так. также, что еще более странно, симптом не отображался при выполнении HTTP-запроса Get.

во всяком случае, я надеюсь, что это поможет некоторым там!

ч

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...