解決Java處理HTTP請(qǐng)求超時(shí)的問(wèn)題
在發(fā)送POST或GET請(qǐng)求時(shí),返回超時(shí)異常處理辦法:
捕獲 SocketTimeoutException | ConnectTimeoutException | ConnectionPoolTimeout 異常
三種異常說(shuō)明:
SocketTimeoutException:是Java包下拋出的異常,這定義了Socket讀數(shù)據(jù)的超時(shí)時(shí)間,即從server獲取響應(yīng)數(shù)據(jù)須要等待的時(shí)間;當(dāng)讀取或者接收Socket超時(shí)會(huì)拋出SocketTimeoutException。
ConnectTimeoutException:是Apache的HttpClient包拋出的超時(shí)異常,定義了通過(guò)網(wǎng)絡(luò)與server建立連接的超時(shí)時(shí)間,Httpclient包中通過(guò)一個(gè)異步線程去創(chuàng)建與server的socket連接,這就是該socket連接的超時(shí)時(shí);
當(dāng)連接HTTPserver或者等待HttpConnectionManager管理的一個(gè)有效連接超時(shí)出錯(cuò)會(huì)拋出ConnectionTimeoutException。
ConnectionPoolTimeout:也是Apache的HttpClient包拋出的超時(shí)異常,定義了從 ConnectionManager 管理的連接池中取出連接的超時(shí)時(shí)間;出錯(cuò)會(huì)拋出 ConnectionPoolTimeoutException。
總結(jié):
SocketTimeoutException異常是一個(gè)通用的異常,無(wú)論是用原生的HTTP請(qǐng)求,還是用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("請(qǐng)求連接超時(shí):" + e.getMessage());
} catch (IOException e) {
e.printStackTrace();
System.out.println("請(qǐng)求異常,異常信息:" + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
補(bǔ)充:java 發(fā)送http請(qǐng)求(連接超時(shí)處理)
業(yè)務(wù)背景:
某項(xiàng)目跟第三方公司對(duì)接。
業(yè)務(wù)描述:
出于數(shù)據(jù)安全考慮,需要從服務(wù)器發(fā)送請(qǐng)求,來(lái)調(diào)用第三方公司提供的接口。但是該場(chǎng)景是銷售類型,響應(yīng)時(shí)間必須夠快,那么就要設(shè)置響應(yīng)的超時(shí)處理。
不然讓客戶看著圈圈在那里轉(zhuǎn)半天,誰(shuí)買?
項(xiàng)目架構(gòu):
jdk1.7
spring4.2.9
詳細(xì)內(nèi)容:
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpPost httpPost = new HttpPost(要訪問(wèn)的URL);
//配置超時(shí)
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000).setConnectionRequestTimeout(5000)
.setSocketTimeout(5000).build();
httpPost.setConfig(requestConfig);
//設(shè)置post請(qǐng)求參數(shù)
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("attr1", 參數(shù)值1));
nvps.add(new BasicNameValuePair("attr2", 參數(shù)值2));
nvps.add(new BasicNameValuePair("attr3", 參數(shù)值3));
……
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
//執(zhí)行post請(qǐng)求
CloseableHttpResponse response = httpclient.execute(httpPost);
// 判斷網(wǎng)絡(luò)連接狀態(tài)碼是否正常(0--200都數(shù)正常)
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//獲取響應(yīng)實(shí)體
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("請(qǐng)求未成功響應(yīng): "+ response.getStatusLine());
}
} catch (ConnectTimeoutException e) {
System.out.println(api_type+"請(qǐng)求超時(shí)");
} catch (ClientProtocolException e) {
System.out.println("請(qǐng)求失敗");
} catch (Exception e) {
e.printStackTrace();
} finally {
//釋放連接
try {
if(httpclient!=null){
httpclient.close();
}
} catch (IOException e) {
System.out.println(api_type+"連接無(wú)法關(guān)閉");
}
}
.setConnectTimeout(5000).setConnectionRequestTimeout(5000)
.setSocketTimeout(5000).build();
httpPost.setConfig(requestConfig);
//設(shè)置post請(qǐng)求參數(shù)
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("attr1", 參數(shù)值1));
nvps.add(new BasicNameValuePair("attr2", 參數(shù)值2));
nvps.add(new BasicNameValuePair("attr3", 參數(shù)值3));
……
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
//執(zhí)行post請(qǐng)求
CloseableHttpResponse response = httpclient.execute(httpPost);
// 判斷網(wǎng)絡(luò)連接狀態(tài)碼是否正常(0--200都數(shù)正常)
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//獲取響應(yīng)實(shí)體
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("請(qǐng)求未成功響應(yīng): "+ response.getStatusLine());
}
} catch (ConnectTimeoutException e) {
System.out.println(api_type+"請(qǐng)求超時(shí)");
} catch (ClientProtocolException e) {
System.out.println("請(qǐng)求失敗");
} catch (Exception e) {
e.printStackTrace();
} finally {
//釋放連接
try {
if(httpclient!=null){
httpclient.close();
}
} catch (IOException e) {
System.out.println(api_type+"連接無(wú)法關(guān)閉");
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- JAVA發(fā)送http get/post請(qǐng)求,調(diào)用http接口、方法詳解
- JAVA發(fā)送HTTP請(qǐng)求,返回HTTP響應(yīng)內(nèi)容,應(yīng)用及實(shí)例代碼
- JAVA發(fā)送HTTP請(qǐng)求的四種方式總結(jié)
- JAVA獲取HTTP請(qǐng)求頭的方法示例
- 詳解java實(shí)現(xiàn)HTTP請(qǐng)求的三種方式
- Java實(shí)現(xiàn)HTTP請(qǐng)求的4種方式總結(jié)
- java實(shí)現(xiàn)http請(qǐng)求工具類示例
- Java發(fā)送https請(qǐng)求代碼實(shí)例
- Java中HTTP請(qǐng)求的常見(jiàn)錯(cuò)誤與排查解決方法
相關(guān)文章
Spring?Kafka中如何通過(guò)參數(shù)配置解決超時(shí)問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于Spring?Kafka中如何通過(guò)參數(shù)配置解決超時(shí)問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01
java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時(shí)素材
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時(shí)素材,網(wǎng)絡(luò)圖片上傳到微信服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
解決RestTemplate 請(qǐng)求url中包含百分號(hào) 會(huì)被轉(zhuǎn)義成25的問(wèn)題
這篇文章主要介紹了解決RestTemplate 請(qǐng)求url中包含百分號(hào) 會(huì)被轉(zhuǎn)義成25的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-10-10
Struts2實(shí)現(xiàn)文件下載功能代碼分享(文件名中文轉(zhuǎn)碼)
這篇文章主要介紹了Struts2實(shí)現(xiàn)文件下載功能代碼分享(文件名中文轉(zhuǎn)碼)的相關(guān)資料,需要的朋友可以參考下2016-06-06
Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解
這篇文章主要介紹了Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
SpringBoot application.yml和bootstrap.yml的區(qū)別
本文主要介紹了SpringBoot application.yml和bootstrap.yml的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04

