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

Hub*_*ert 16 android http

我有我的Android应用程序使用HttpClient来访问部署在我的Tomcat上的servlet.它安装在我的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)
Run Code Online (Sandbox Code Playgroud)

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

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

有人知道发生了什么吗?

P. *_*etz 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);
Run Code Online (Sandbox Code Playgroud)


Hub*_*ert 11

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

期待:100-继续

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

  HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false);
Run Code Online (Sandbox Code Playgroud)