From c958553e762ad0e65397bacc630e98f476621dea Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 5 Sep 2024 21:17:10 +0800 Subject: [PATCH] add request config --- .../dromara/hutool/http/HttpGlobalConfig.java | 11 +++---- .../hutool/http/client/ClientConfig.java | 4 +-- .../dromara/hutool/http/client/Request.java | 14 ++++---- .../engine/httpclient4/HttpClient4Engine.java | 32 +++++++++++++++++-- .../engine/httpclient5/HttpClient5Engine.java | 32 +++++++++++++++++-- .../client/engine/jdk/JdkClientEngine.java | 4 +-- .../hutool/http/webservice/SoapClient.java | 2 +- .../org/dromara/hutool/http/DownloadTest.java | 2 +- .../org/dromara/hutool/http/HttpUtilTest.java | 2 +- .../dromara/hutool/http/IssueI5TPSYTest.java | 2 +- .../org/dromara/hutool/http/RequestTest.java | 4 +-- 11 files changed, 80 insertions(+), 29 deletions(-) diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/HttpGlobalConfig.java b/hutool-http/src/main/java/org/dromara/hutool/http/HttpGlobalConfig.java index 976a8e851..bf6418aa0 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/HttpGlobalConfig.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/HttpGlobalConfig.java @@ -42,7 +42,7 @@ public class HttpGlobalConfig implements Serializable { */ private static int timeout = -1; private static String boundary = "--------------------Hutool_" + RandomUtil.randomStringLower(16); - private static int maxRedirectCount = 0; + private static int maxRedirects = 0; private static boolean ignoreEOFError = true; /** * 是否从响应正文中的meta标签获取编码信息 @@ -99,10 +99,9 @@ public class HttpGlobalConfig implements Serializable { * 如果设置为1,表示重定向一次,即请求两次 * * @return 全局默认的最大重定向次数 - * @since 5.7.19 */ - public static int getMaxRedirectCount() { - return maxRedirectCount; + public static int getMaxRedirects() { + return maxRedirects; } /** @@ -112,8 +111,8 @@ public class HttpGlobalConfig implements Serializable { * @param customMaxRedirectCount 全局默认的最大重定向次数 * @since 5.7.19 */ - synchronized public static void setMaxRedirectCount(final int customMaxRedirectCount) { - maxRedirectCount = customMaxRedirectCount; + synchronized public static void setMaxRedirects(final int customMaxRedirectCount) { + maxRedirects = customMaxRedirectCount; } /** diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/ClientConfig.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/ClientConfig.java index 6f2e8e99f..a24457602 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/ClientConfig.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/ClientConfig.java @@ -211,7 +211,7 @@ public class ClientConfig { /** * 是否遇到响应状态码3xx时自动重定向请求
- * 注意:当打开客户端级别的自动重定向,则{@link Request#maxRedirectCount()}无效 + * 注意:当打开客户端级别的自动重定向,则{@link Request#maxRedirects()}无效 * * @return 是否遇到响应状态码3xx时自动重定向请求 */ @@ -221,7 +221,7 @@ public class ClientConfig { /** * 设置是否遇到响应状态码3xx时自动重定向请求
- * 注意:当打开客户端级别的自动重定向,则{@link Request#maxRedirectCount()}无效 + * 注意:当打开客户端级别的自动重定向,则{@link Request#maxRedirects()}无效 * * @param followRedirects 是否遇到响应状态码3xx时自动重定向请求 * @return this diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/Request.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/Request.java index 2b48866cc..0270d0022 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/Request.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/Request.java @@ -133,7 +133,7 @@ public class Request implements HeaderOperation { /** * 最大重定向次数 */ - private int maxRedirectCount; + private int maxRedirects; /** * 是否是REST请求模式,REST模式运行GET请求附带body */ @@ -145,7 +145,7 @@ public class Request implements HeaderOperation { public Request() { method = Method.GET; headers = new ListValueMap<>(new LinkedHashMap<>()); - maxRedirectCount = HttpGlobalConfig.getMaxRedirectCount(); + maxRedirects = HttpGlobalConfig.getMaxRedirects(); // 全局默认请求头 header(GlobalHeaders.INSTANCE.headers(), false); @@ -403,8 +403,8 @@ public class Request implements HeaderOperation { * * @return 最大重定向请求次数 */ - public int maxRedirectCount() { - return maxRedirectCount; + public int maxRedirects() { + return maxRedirects; } /** @@ -412,11 +412,11 @@ public class Request implements HeaderOperation { * 如果次数小于1则表示不重定向,大于等于1表示打开重定向
* 注意:当{@link ClientConfig#isFollowRedirects()}为{@code true}时,此参数无效 * - * @param maxRedirectCount 最大重定向次数 + * @param maxRedirects 最大重定向次数 * @return this */ - public Request setMaxRedirectCount(final int maxRedirectCount) { - this.maxRedirectCount = Math.max(maxRedirectCount, 0); + public Request setMaxRedirects(final int maxRedirects) { + this.maxRedirects = Math.max(maxRedirects, 0); return this; } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java index 5859a82e9..e5a491071 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java @@ -110,18 +110,24 @@ public class HttpClient4Engine extends AbstractClientEngine { final HttpClientBuilder clientBuilder = HttpClients.custom(); final ClientConfig config = ObjUtil.defaultIfNull(this.config, HttpClientConfig::of); + // SSL配置 final SSLInfo sslInfo = config.getSslInfo(); if (null != sslInfo) { clientBuilder.setSSLSocketFactory(buildSocketFactory(sslInfo)); } + + // 连接配置 + clientBuilder.setConnectionManager(buildConnectionManager(config)); + + // 实例级别默认请求配置 + clientBuilder.setDefaultRequestConfig(buildRequestConfig(config)); + + // 缓存 if (config.isDisableCache()) { clientBuilder.disableAuthCaching(); } - clientBuilder.setConnectionManager(buildConnectionManager(config)); - clientBuilder.setDefaultRequestConfig(buildRequestConfig(config)); - // 设置默认头信息 clientBuilder.setDefaultHeaders(toHeaderList(GlobalHeaders.INSTANCE.headers())); @@ -152,6 +158,9 @@ public class HttpClient4Engine extends AbstractClientEngine { .create(message.method().name()) .setUri(url.toURI()); + // 自定义单次请求配置 + requestBuilder.setConfig(buildRequestConfig(message)); + // 填充自定义头 message.headers().forEach((k, v1) -> v1.forEach((v2) -> requestBuilder.addHeader(k, v2))); @@ -212,6 +221,23 @@ public class HttpClient4Engine extends AbstractClientEngine { return manager; } + /** + * 构建请求配置,包括重定向 + * @param request 请求 + * @return {@link RequestConfig} + */ + private static RequestConfig buildRequestConfig(final Request request) { + final RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); + final int maxRedirects = request.maxRedirects(); + if (maxRedirects > 0) { + requestConfigBuilder.setMaxRedirects(maxRedirects); + } else { + requestConfigBuilder.setRedirectsEnabled(false); + } + + return requestConfigBuilder.build(); + } + /** * 构建请求配置,包括连接请求超时和响应(读取)超时 * diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java index 79c33accd..bf8684954 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java @@ -116,10 +116,15 @@ public class HttpClient5Engine extends AbstractClientEngine { } final HttpClientBuilder clientBuilder = HttpClients.custom(); - final ClientConfig config = ObjUtil.defaultIfNull(this.config, HttpClientConfig::of); + + // 连接配置,包括SSL配置等 clientBuilder.setConnectionManager(buildConnectionManager(config)); + + // 实例级别默认请求配置 clientBuilder.setDefaultRequestConfig(buildRequestConfig(config)); + + // 缓存 if (config.isDisableCache()) { clientBuilder.disableAuthCaching(); } @@ -151,7 +156,10 @@ public class HttpClient5Engine extends AbstractClientEngine { final UrlBuilder url = message.handledUrl(); Assert.notNull(url, "Request URL must be not null!"); - final ClassicHttpRequest request = new HttpUriRequestBase(message.method().name(), url.toURI()); + final HttpUriRequestBase request = new HttpUriRequestBase(message.method().name(), url.toURI()); + + // 自定义单次请求配置 + request.setConfig(buildRequestConfig(message)); // 填充自定义头 request.setHeaders(toHeaderList(message.headers()).toArray(new Header[0])); @@ -222,6 +230,24 @@ public class HttpClient5Engine extends AbstractClientEngine { return connectionManagerBuilder.build(); } + /** + * 构建请求配置,包括重定向配置 + * + * @param request 请求 + * @return {@link RequestConfig} + */ + private static RequestConfig buildRequestConfig(final Request request) { + final RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); + final int maxRedirects = request.maxRedirects(); + if (maxRedirects > 0) { + requestConfigBuilder.setMaxRedirects(maxRedirects); + } else { + requestConfigBuilder.setRedirectsEnabled(false); + } + + return requestConfigBuilder.build(); + } + /** * 构建请求配置,包括连接请求超时和响应(读取)超时 * @@ -240,7 +266,7 @@ public class HttpClient5Engine extends AbstractClientEngine { if (readTimeout > 0) { requestConfigBuilder.setResponseTimeout(readTimeout, TimeUnit.MILLISECONDS); } - if(config instanceof HttpClientConfig){ + if (config instanceof HttpClientConfig) { requestConfigBuilder.setMaxRedirects(((HttpClientConfig) config).getMaxRedirects()); } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/JdkClientEngine.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/JdkClientEngine.java index 435d517c6..ad62d54b4 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/JdkClientEngine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/JdkClientEngine.java @@ -163,7 +163,7 @@ public class JdkClientEngine extends AbstractClientEngine { */ private JdkHttpResponse sendRedirectIfPossible(final JdkHttpConnection conn, final Request message, final boolean isAsync) { // 手动实现重定向 - if (message.maxRedirectCount() > 0) { + if (message.maxRedirects() > 0) { final int code; try { code = conn.getCode(); @@ -176,7 +176,7 @@ public class JdkClientEngine extends AbstractClientEngine { if (code != HttpURLConnection.HTTP_OK) { if (HttpStatus.isRedirected(code)) { message.url(getLocationUrl(message.handledUrl(), conn.header(HeaderName.LOCATION))); - if (conn.redirectCount < message.maxRedirectCount()) { + if (conn.redirectCount < message.maxRedirects()) { conn.redirectCount++; return send(message, isAsync); } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/webservice/SoapClient.java b/hutool-http/src/main/java/org/dromara/hutool/http/webservice/SoapClient.java index 794f1398c..30371942e 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/webservice/SoapClient.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/webservice/SoapClient.java @@ -594,7 +594,7 @@ public class SoapClient implements HeaderOperation { public Response sendForResponse() { final Request request = Request.of(this.url) .method(Method.POST) - .setMaxRedirectCount(2) + .setMaxRedirects(2) .contentType(getXmlContentType()) .header(this.headers, false) .body(getMsgStr(false)); diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/DownloadTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/DownloadTest.java index 791b6dcb7..82bc78dc8 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/DownloadTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/DownloadTest.java @@ -217,7 +217,7 @@ public class DownloadTest { public void downloadTeamViewerTest() throws IOException { // 此URL有3次重定向, 需要请求4次 final String url = "https://download.teamviewer.com/download/TeamViewer_Setup_x64.exe"; - HttpGlobalConfig.setMaxRedirectCount(20); + HttpGlobalConfig.setMaxRedirects(20); final Path temp = Files.createTempFile("tmp", ".exe"); final File file = HttpDownloader.downloadFile(url, temp.toFile()); Console.log(file.length()); diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/HttpUtilTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/HttpUtilTest.java index 95fd1a683..68c67e725 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/HttpUtilTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/HttpUtilTest.java @@ -98,7 +98,7 @@ public class HttpUtilTest { public void get12306Test() { // 某些网站需要打开信任全部域 // HttpGlobalConfig.setTrustAnyHost(true); - HttpUtil.send(Request.of("https://kyfw.12306.cn/otn/").setMaxRedirectCount(2)) + HttpUtil.send(Request.of("https://kyfw.12306.cn/otn/").setMaxRedirects(2)) .then(response -> Console.log(response.bodyStr())); } diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/IssueI5TPSYTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/IssueI5TPSYTest.java index 81dcca3d9..2e9d2d4e7 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/IssueI5TPSYTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/IssueI5TPSYTest.java @@ -26,7 +26,7 @@ public class IssueI5TPSYTest { public void redirectTest() { final String url = "https://bsxt.gdzwfw.gov.cn/UnifiedReporting/auth/newIndex"; final Response res = HttpUtil.send(Request.of(url) - .setMaxRedirectCount(2) + .setMaxRedirects(2) .header(HeaderName.USER_AGENT, "PostmanRuntime/7.29.2") .cookie("jsessionid=s%3ANq6YTcIHQWrHkEqOSxiQNijDMhoFNV4_.h2MVD1CkW7sOZ60OSnPs7m4K%2FhENfYy%2FdzjKvSiZF4E")); Console.log(res.body()); diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/RequestTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/RequestTest.java index 72ccefd7b..83d0b3cab 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/RequestTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/RequestTest.java @@ -168,12 +168,12 @@ public class RequestTest { // String url = "https://api.btstu.cn/sjtx/api.php?lx=b1"; // 方式1:全局设置 - HttpGlobalConfig.setMaxRedirectCount(1); + HttpGlobalConfig.setMaxRedirects(1); Response execute = Request.of(url).send(); Console.log(execute.getStatus(), execute.header(HeaderName.LOCATION)); // 方式2,单独设置 - execute = Request.of(url).setMaxRedirectCount(1).send(); + execute = Request.of(url).setMaxRedirects(1).send(); Console.log(execute.getStatus(), execute.header(HeaderName.LOCATION)); }