解决Java处理HTTP请求超时的问题
在发送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 异常。
例:
public static String doGet(String url, Object params, String contentType) { try { return HttpUtils.doGetSend(url, params, contentType); } catch (SocketTimeoutException | ConnectTimeoutException e) { e.printStackTrace(); System.out.println("请求连接超时:" + e.getMessage()); } catch (IOException e) { e.printStackTrace(); System.out.println("请求异常,异常信息:" + e.getMessage()); } catch (Exception e) { e.printStackTrace(); } return null; }
补充:java 发送http请求(连接超时处理)
业务背景:
某项目跟第三方公司对接。
业务描述:
出于数据安全考虑,需要从服务器发送请求,来调用第三方公司提供的接口。但是该场景是销售类型,响应时间必须够快,那么就要设置响应的超时处理。
不然让客户看着圈圈在那里转半天,谁买?
项目架构:
jdk1.7
spring4.2.9
详细内容:
CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httpPost = new HttpPost(要访问的URL); //配置超时 RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(5000).setConnectionRequestTimeout(5000) .setSocketTimeout(5000).build(); httpPost.setConfig(requestConfig); //设置post请求参数 List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("attr1", 参数值1)); nvps.add(new BasicNameValuePair("attr2", 参数值2)); nvps.add(new BasicNameValuePair("attr3", 参数值3)); …… httpPost.setEntity(new UrlEncodedFormEntity(nvps)); //执行post请求 CloseableHttpResponse response = httpclient.execute(httpPost); // 判断网络连接状态码是否正常(0--200都数正常) if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //获取响应实体 responseMessage = EntityUtils.toString(response.getEntity(),"utf-8"); System.out.println(responseMessage); if(responseMessage!=null && !"".equals(responseMessage)){ String data = new String(AESUtil.decrypt(Base64.decode(responseMessage), key),"UTF-8"); String msg = translate_PRE(data,trans_type,transNo); result.put("msg", msg); } }else{ System.out.println("请求未成功响应: "+ response.getStatusLine()); } } catch (ConnectTimeoutException e) { System.out.println(api_type+"请求超时"); } catch (ClientProtocolException e) { System.out.println("请求失败"); } catch (Exception e) { e.printStackTrace(); } finally { //释放连接 try { if(httpclient!=null){ httpclient.close(); } } catch (IOException e) { System.out.println(api_type+"连接无法关闭"); } } .setConnectTimeout(5000).setConnectionRequestTimeout(5000) .setSocketTimeout(5000).build(); httpPost.setConfig(requestConfig); //设置post请求参数 List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("attr1", 参数值1)); nvps.add(new BasicNameValuePair("attr2", 参数值2)); nvps.add(new BasicNameValuePair("attr3", 参数值3)); …… httpPost.setEntity(new UrlEncodedFormEntity(nvps)); //执行post请求 CloseableHttpResponse response = httpclient.execute(httpPost); // 判断网络连接状态码是否正常(0--200都数正常) if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //获取响应实体 responseMessage = EntityUtils.toString(response.getEntity(),"utf-8"); System.out.println(responseMessage); if(responseMessage!=null && !"".equals(responseMessage)){ String data = new String(AESUtil.decrypt(Base64.decode(responseMessage), key),"UTF-8"); String msg = translate_PRE(data,trans_type,transNo); result.put("msg", msg); } }else{ System.out.println("请求未成功响应: "+ response.getStatusLine()); } } catch (ConnectTimeoutException e) { System.out.println(api_type+"请求超时"); } catch (ClientProtocolException e) { System.out.println("请求失败"); } catch (Exception e) { e.printStackTrace(); } finally { //释放连接 try { if(httpclient!=null){ httpclient.close(); } } catch (IOException e) { System.out.println(api_type+"连接无法关闭"); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。如有错误或未考虑完全的地方,望不吝赐教。
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
C#使用Http Post方式传递Json数据字符串调用Web Service
这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
解决Feign切换client到okhttp无法生效的坑(出现原因说明)
这篇文章主要介绍了解决Feign切换client到okhttp无法生效的坑(出现原因说明),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-25完美解决SpringCloud-OpenFeign使用okhttp替换不生效问题
这篇文章主要介绍了完美解决SpringCloud-OpenFeign使用okhttp替换不生效问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-25- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 下面小编就为大家带来一篇C#模拟http 发送post或get请求的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03