在android中调用rest webservice时超时异常

时间:2010-11-22 15:24:08

标签: android web-services

我试图在andoid中调用rest web服务,但我总是有一个超时异常。 代码是:

HttpClient httpclient = new DefaultHttpClient();  

HttpGet request = new HttpGet("http://XXXX:8080/YYY/zzzz?username=0001epd&password=1111");

ResponseHandler<String> handler = new BasicResponseHandler();  
try {  
        String result = httpclient.execute(request, handler);  
} catch (ClientProtocolException e) {  
           e.printStackTrace();  
} catch (IOException e) {  
          e.printStackTrace();  
           }  
httpclient.getConnectionManager().shutdown();  

你知道错误在哪里吗?

在清单中我添加了android.permission.INTERNET

3 个答案:

答案 0 :(得分:1)

也许您的移动设备或工作站的互联网连接速度慢或远程服务需要一些时间。您可以使用Internet浏览器测试它以请求REST URL。

至少你可以尝试增加代码中的超时时间:

final int timeout = 10000; //ms
HttpConnectionParams.setConnectionTimeout(httpParams, timeout);
HttpConnectionParams.setSoTimeout(httpParams, timeout);
final HttpClient httpclient = new DefaultHttpClient(httpParams);

答案 1 :(得分:1)

我怀疑这是你可以通过提高限制来解决的那种超时,因为Impression建议,这听起来更像是你的设置到达服务器的网络问题。

这是来自模拟器还是真实设备?确保您可以实际到达服务器(例如,查看浏览器中输入XXXX:8080的内容);如果您在模拟器上尝试连接到本地计算机,则需要使用10.0.2.2作为IP地址(不是127.0.0.1或LAN上的IP)。如果您使用的是物理设备,则通常的客户端 - 服务器网络检查规则适用:

  • 如果它是本地开发服务器,您是否与服务器位于同一LAN /子网上?
  • 如果您尝试通过Internet而不是从LAN进行外部连接,是否确定打开了所有正确的防火墙端口以从开发服务器发出外部请求?
  • 您的服务器软件是否设置为接受来自外部请求的连接? (出于安全原因,某些开发服务器(如Django)默认设置为仅接受localhost连接。)

答案 2 :(得分:1)

如果你在模拟器上运行它,你是否尝试将上面的url放在模拟器浏览器上,看看你是否得到了结果。如果您可以在浏览器中看到结果并且您在代理后面,请尝试在代码中添加以下行

HttpParams my_httpParams = new BasicHttpParams(); 

final String proxyHost = android.net.Proxy.getDefaultHost();

final int proxyPort = android.net.Proxy.getDefaultPort();

if(proxyPort != -1)
{
  my_httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxyHost, proxyPort));            
}

在DefaultHttpClient中传递HttpParams