解决Java处理HTTP请求超时的问题

网友投稿 387 2023-01-24

解决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 nvps = new ArrayList();

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 nvps = new ArrayList();

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+"连接无法关闭");

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 重写时应当遵守的 11 条规则
下一篇:社交软件开放api接口(社交软件开放api接口)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~