HttpClient на Android: NoHttpResponseException через UMTS / 3G - PullRequest
16 голосов
/ 12 января 2010

У меня есть приложение для Android, которое использует HttpClient для доступа к моему сервлету развернут на моем Tomcat. Он установлен на моем HTC Magic.

Если я запускаю его при подключении по Wi-Fi: он работает. Если я запускаю его при подключении к 3G (сеть передачи данных GSM): он не работает, но мой сервлет достигнут. Другими словами, кажется, что мой телефон никогда не получит ответ:

Technical problem while receiving response.
org.apache.http.NoHttpResponseException: The target server failed to respond
   at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:85)
   at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
   at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179)
   at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
   at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
   at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
   at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
   at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

Если я использую веб-браузер через 3G для активации тестовой HTML-страницы, которая поставляется вместе с моим сервлетом, он успешно достигает того же сервлета (страница получает ответ).

Как я могу отладить HttpClient или попросить его сбросить все?

Кто-нибудь знает, что происходит?

Ответы [ 3 ]

15 голосов
/ 18 февраля 2011

Я тоже столкнулся с этой проблемой. Это происходило только время от времени, обычно при первоначальном запросе http. Последующие запросы будут работать нормально. Добавление setUseExpectContinue, похоже, не работает.

Решение в моем случае состояло в том, чтобы добавить обработчик повторных попыток, который повторял бы запрос на определенных исключениях:

        HttpProtocolParams.setUseExpectContinue(client.getParams(), false);

        HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {

            public boolean retryRequest(IOException exception, int executionCount,
                    HttpContext context) {
                // retry a max of 5 times
                if(executionCount >= 5){
                    return false;
                }
                if(exception instanceof NoHttpResponseException){
                    return true;
                } else if (exception instanceof ClientProtocolException){
                    return true;
                } 
                return false;
            }
        };
        client.setHttpRequestRetryHandler(retryHandler);
11 голосов
/ 23 января 2010

Я наконец избавился от этой проблемы: просто заголовок HTTP, который был плохо обработан сервером squid в дороге:

Ожидайте: 100-Продолжить

Похоже, что это по умолчанию с DefaultHttpClient на Android SDK. Чтобы решить эту проблему, просто добавьте это в свой код:

  HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false);
3 голосов
/ 18 декабря 2012

В Android была ошибка, из-за которой HTTPS выполнял обратный поиск DNS (исправлено в Ice Cream Sandwich)

http://code.google.com/p/android/issues/detail?id=13117 упомянул работу, которая работает на моем телефоне.

...