2010-01-12 14 views
16

Tengo mi aplicación de Android que utiliza HttpClient para llegar a mi servlet desplegado en mi Tomcat. Está instalado en mi HTC Magic.HttpClient en Android: NoHttpResponseException a través de UMTS/3G

Si lo lanzo cuando estoy conectado a Wifi: funciona. Si lo inicio cuando estoy conectado a 3G (red de datos GSM): no funciona, pero se alcanza mi servlet. En otras palabras, parece que mi teléfono nunca obtener la respuesta:

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) 

Si utilizo el navegador web a través de 3G para activar la página HTML de prueba que se empaqueta con mi servlet, se llega a la misma servlet con éxito (la página recibe la respuesta).

¿Cómo podría depurar HttpClient o pedirle que volcara todo?

¿Alguien tiene alguna pista sobre lo que está pasando?

+0

¿Ha comprobado los registros de su servidor para ver si la solicitud se está realizando a través del cable? Si es así, ¿sus registros le dicen algo (por ejemplo, error del lado del servidor)? – CommonsWare

+0

El servidor recibe la solicitud (muy rápidamente) y da una respuesta con éxito, de la misma manera que lo hace con la solicitud que se recibe cuando está en wifi. Sería más eficiente poder depurar HttpClient ... La excepción se produce después de mucho tiempo, más o menos 10 minutos, así que supongo que realmente no hay nada que regrese al dispositivo. Si es cierto, algo está perdiendo mi respuesta en el aire. ¿Podría mi red GSM tener algún filtro? – Hubert

+0

Curiosamente, hay un servidor de calamar instalado en proxy.cwg.net que parece ser la causa. ¿Pero por qué funciona con la página HTML de prueba y no con el HttpClient en la misma condición? – Hubert

Respuesta

11

que finalmente se deshizo de este problema: simplemente una cabecera HTTP que fue mal manejado por un servidor squid en el camino:

espera: 100-continue

Parece ser que hay de forma predeterminada con DefaultHttpClient en Android SDK. Para solucionar esto, simplemente agregue eso en su código:

HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false); 
13

Encontré este problema también. Ocurrió solo esporádicamente, generalmente en una solicitud http inicial. Las solicitudes posteriores funcionarían bien. Agregar setUseExpectContinue no parece funcionar.

La solución en mi caso era para agregar un controlador de reintento que vuelva a intentar la solicitud en excepciones específicas:

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

Este es exactamente el problema que estoy teniendo ... desafortunadamente, el servidor recibe la primera solicitud y cambia algún estado ... enviar esa misma solicitud de nuevo realmente borra cosas ... – danb

+0

@PTG No funciona en mi caso. Establecí max executionCount en 50 para verificar si funciona después de tantos intentos. Pero no lo hizo. ¿Alguna otra idea? Por cierto, lo uso con proxy y solo obtengo esta excepción. – Geek

Cuestiones relacionadas