好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

解决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 异常。

例:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

详细内容:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

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

       }

  }

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

原文链接:https://blog.csdn.net/xhaimail/article/details/103050282

查看更多关于解决Java处理HTTP请求超时的问题的详细内容...

  阅读:59次