Android上的HttpClient:通过UMTS / 3G的NoHttpResponseException

时间:2010-01-12 20:55:51

标签: android http

我的Android应用程序使用HttpClient来访问我的servlet 部署在我的Tomcat上。它安装在我的HTC Magic上。

如果我在Wifi连接时启动它:它可以工作。 如果我在连接到3G(GSM数据网络)时启动它:它不起作用但我的servlet已到达。换句话说,似乎我的手机永远不会得到回复:

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)

如果我使用Web浏览器通过3G激活与我的servlet一起打包的测试HTML页面,它会成功到达同一个servlet(页面会收到响应)。

我如何调试HttpClient或要求它转储所有内容?

有人知道发生了什么事吗?

3 个答案:

答案 0 :(得分:15)

我也遇到了这个问题。它只是偶尔发生,通常是在初始的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);

答案 1 :(得分:11)

我终于摆脱了这个问题:只是一个在路上被鱿鱼服务器严重处理的HTTP标头:

  

期待:100-Continue

默认情况下,android SDK上的DefaultHttpClient似乎存在。要解决这个问题,只需在代码中添加:

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

答案 2 :(得分:3)

Android有一个错误,其中HTTPS进行反向DNS查找(在冰淇淋三明治中修复)

http://code.google.com/p/android/issues/detail?id=13117提到了可以在我的手机上工作的工作。