重点是HttpRequestRetryHandler.retryRequest()方法
public static String callHttpServer(String contentType,String json, String url) { String result = ""; CloseableHttpClient httpclient = null; CloseableHttpResponse response = null; try { HttpClientBuilder httpClientBuilder = HttpClients.custom(); httpClientBuilder.setRetryHandler(new HttpRequestRetryHandler() { @Override public boolean retryRequest(IOException arg0, int retryTimes, HttpContext arg2) { if (retryTimes > 3) { return false; } if (arg0 instanceof UnknownHostException || arg0 instanceof ConnectTimeoutException || !(arg0 instanceof SSLException) || arg0 instanceof NoHttpResponseException) { return true; } HttpClientContext clientContext = HttpClientContext.adapt(arg2); HttpRequest request = clientContext.getRequest(); boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); if (idempotent) { return true; } return false; } }); httpclient = httpClientBuilder.build(); HttpPost httppost = new HttpPost(url); httppost.setHeader("Content-Type", contentType); httppost.setHeader("Expect", "100-continue"); httppost.setHeader("Accept-Encoding", "gzip,deflate"); httppost.setHeader("Connection", "Keep-Alive"); //如果json 为null,会出现异常 if (null != json) { StringEntity stringEntity = new StringEntity(json, "utf-8"); stringEntity.setContentEncoding("UTF-8"); stringEntity.setContentType("application/json"); httppost.setEntity(stringEntity); } response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); if (entity != null) { int status = response.getStatusLine().getStatusCode(); if ((status >= 200 && status < 300)) { result = EntityUtils.toString(entity); } else { result = null; } } } catch (Exception ex) { logger.error("call http service error:{}", ex); result = null; ex.printStackTrace(); } finally { if (null != response) { try { response.close(); } catch (IOException e) { logger.error("call http service response close error:{}", e); e.printStackTrace(); } } } return result; }
更多参考: https://blog.csdn.net/zmx729618/article/details/78352879