HttpClient на Android: NoHttpResponseException через UMTS/3G
У меня есть приложение для 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 или попросить его сбросить все?
Кто-нибудь знает, что происходит?
Ответы
Ответ 1
Я, наконец, избавился от этой проблемы: просто HTTP-заголовок, плохо обработанный сервером squid на дороге:
Ожидайте: 100-Продолжить
Кажется, что он по умолчанию с DefaultHttpClient на Android SDK. Чтобы решить эту проблему, просто добавьте это в свой код:
HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false);
Ответ 2
Я столкнулся с этой проблемой. Это происходило только эпизодически, как правило, при первоначальном 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);
Ответ 3
У Android была ошибка, когда HTTPS делал обратные DNS-запросы (исправлено в сэндвиче с мороженым)
http://code.google.com/p/android/issues/detail?id=13117 упомянул работу, которая работает на моем телефоне.