文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中出现HTTP请求超时如何处理

2023-06-14 09:17

关注

这篇文章给大家介绍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中出现HTTP请求超时如何处理就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯