我的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或要求它转储所有内容?
有人知道发生了什么事吗?
答案 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提到了可以在我的手机上工作的工作。