经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
解决Java处理HTTP请求超时的问题
来源:jb51  时间:2021/3/29 12:00:36  对本文有异议

在发送POST或GET请求时,返回超时异常处理办法:

捕获 SocketTimeoutException | ConnectTimeoutException | ConnectionPoolTimeout 异常

三种异常说明:

SocketTimeoutException:是Java包下抛出的异常,这定义了Socket读数据的超时时间,即从server获取响应数据须要等待的时间;当读取或者接收Socket超时会抛出SocketTimeoutException。

ConnectTimeoutException:是Apache的HttpClient包抛出的超时异常,定义了通过网络与server建立连接的超时时间,Httpclient包中通过一个异步线程去创建与server的socket连接,这就是该socket连接的超时时;

当连接HTTPserver或者等待HttpConnectionManager管理的一个有效连接超时出错会抛出ConnectionTimeoutException。

ConnectionPoolTimeout:也是Apache的HttpClient包抛出的超时异常,定义了从 ConnectionManager 管理的连接池中取出连接的超时时间;出错会抛出 ConnectionPoolTimeoutException。

总结:

SocketTimeoutException异常是一个通用的异常,无论是用原生的HTTP请求,还是用Apache下的HttpClient包,在抛出的异常中都需要捕获 SocketTimeoutException 异常。

例:

  1. public static String doGet(String url, Object params, String contentType) {
  2. try {
  3. return HttpUtils.doGetSend(url, params, contentType);
  4. } catch (SocketTimeoutException | ConnectTimeoutException e) {
  5. e.printStackTrace();
  6. System.out.println("请求连接超时:" + e.getMessage());
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. System.out.println("请求异常,异常信息:" + e.getMessage());
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. return null;
  14. }

补充:java 发送http请求(连接超时处理)

业务背景:

某项目跟第三方公司对接。

业务描述:

出于数据安全考虑,需要从服务器发送请求,来调用第三方公司提供的接口。但是该场景是销售类型,响应时间必须够快,那么就要设置响应的超时处理。

不然让客户看着圈圈在那里转半天,谁买?

项目架构:

jdk1.7

spring4.2.9

详细内容:

  1. CloseableHttpClient httpclient = HttpClients.createDefault();
  2. try {
  3. HttpPost httpPost = new HttpPost(要访问的URL);
  4. //配置超时
  5. RequestConfig requestConfig = RequestConfig.custom()
  6. .setConnectTimeout(5000).setConnectionRequestTimeout(5000)
  7. .setSocketTimeout(5000).build();
  8. httpPost.setConfig(requestConfig);
  9. //设置post请求参数
  10. List<NameValuePair> nvps = new ArrayList<NameValuePair>();
  11. nvps.add(new BasicNameValuePair("attr1", 参数值1));
  12. nvps.add(new BasicNameValuePair("attr2", 参数值2));
  13. nvps.add(new BasicNameValuePair("attr3", 参数值3));
  14. ……
  15. httpPost.setEntity(new UrlEncodedFormEntity(nvps));
  16. //执行post请求
  17. CloseableHttpResponse response = httpclient.execute(httpPost);
  18. // 判断网络连接状态码是否正常(0--200都数正常)
  19. if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
  20. //获取响应实体
  21. responseMessage = EntityUtils.toString(response.getEntity(),"utf-8");
  22. System.out.println(responseMessage);
  23. if(responseMessage!=null && !"".equals(responseMessage)){
  24. String data = new String(AESUtil.decrypt(Base64.decode(responseMessage), key),"UTF-8");
  25. String msg = translate_PRE(data,trans_type,transNo);
  26. result.put("msg", msg);
  27. }
  28. }else{
  29. System.out.println("请求未成功响应: "+ response.getStatusLine());
  30. }
  31. } catch (ConnectTimeoutException e) {
  32. System.out.println(api_type+"请求超时");
  33. } catch (ClientProtocolException e) {
  34. System.out.println("请求失败");
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. } finally {
  38. //释放连接
  39. try {
  40. if(httpclient!=null){
  41. httpclient.close();
  42. }
  43. } catch (IOException e) {
  44. System.out.println(api_type+"连接无法关闭");
  45. }
  46. }
  47. .setConnectTimeout(5000).setConnectionRequestTimeout(5000)
  48. .setSocketTimeout(5000).build();
  49. httpPost.setConfig(requestConfig);
  50. //设置post请求参数
  51. List<NameValuePair> nvps = new ArrayList<NameValuePair>();
  52. nvps.add(new BasicNameValuePair("attr1", 参数值1));
  53. nvps.add(new BasicNameValuePair("attr2", 参数值2));
  54. nvps.add(new BasicNameValuePair("attr3", 参数值3));
  55. ……
  56. httpPost.setEntity(new UrlEncodedFormEntity(nvps));
  57. //执行post请求
  58. CloseableHttpResponse response = httpclient.execute(httpPost);
  59. // 判断网络连接状态码是否正常(0--200都数正常)
  60. if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
  61. //获取响应实体
  62. responseMessage = EntityUtils.toString(response.getEntity(),"utf-8");
  63. System.out.println(responseMessage);
  64. if(responseMessage!=null && !"".equals(responseMessage)){
  65. String data = new String(AESUtil.decrypt(Base64.decode(responseMessage), key),"UTF-8");
  66. String msg = translate_PRE(data,trans_type,transNo);
  67. result.put("msg", msg);
  68. }
  69. }else{
  70. System.out.println("请求未成功响应: "+ response.getStatusLine());
  71. }
  72. } catch (ConnectTimeoutException e) {
  73. System.out.println(api_type+"请求超时");
  74. } catch (ClientProtocolException e) {
  75. System.out.println("请求失败");
  76. } catch (Exception e) {
  77. e.printStackTrace();
  78. } finally {
  79. //释放连接
  80. try {
  81. if(httpclient!=null){
  82. httpclient.close();
  83. }
  84. } catch (IOException e) {
  85. System.out.println(api_type+"连接无法关闭");
  86. }
  87. }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。如有错误或未考虑完全的地方,望不吝赐教。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号