mirror of
https://gitee.com/dromara/hutool.git
synced 2025-04-24 18:04:54 +08:00
add request config
This commit is contained in:
parent
c314b4e183
commit
c958553e76
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -211,7 +211,7 @@ public class ClientConfig {
|
||||
|
||||
/**
|
||||
* 是否遇到响应状态码3xx时自动重定向请求<br>
|
||||
* 注意:当打开客户端级别的自动重定向,则{@link Request#maxRedirectCount()}无效
|
||||
* 注意:当打开客户端级别的自动重定向,则{@link Request#maxRedirects()}无效
|
||||
*
|
||||
* @return 是否遇到响应状态码3xx时自动重定向请求
|
||||
*/
|
||||
@ -221,7 +221,7 @@ public class ClientConfig {
|
||||
|
||||
/**
|
||||
* 设置是否遇到响应状态码3xx时自动重定向请求<br>
|
||||
* 注意:当打开客户端级别的自动重定向,则{@link Request#maxRedirectCount()}无效
|
||||
* 注意:当打开客户端级别的自动重定向,则{@link Request#maxRedirects()}无效
|
||||
*
|
||||
* @param followRedirects 是否遇到响应状态码3xx时自动重定向请求
|
||||
* @return this
|
||||
|
@ -133,7 +133,7 @@ public class Request implements HeaderOperation<Request> {
|
||||
/**
|
||||
* 最大重定向次数
|
||||
*/
|
||||
private int maxRedirectCount;
|
||||
private int maxRedirects;
|
||||
/**
|
||||
* 是否是REST请求模式,REST模式运行GET请求附带body
|
||||
*/
|
||||
@ -145,7 +145,7 @@ public class Request implements HeaderOperation<Request> {
|
||||
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<Request> {
|
||||
*
|
||||
* @return 最大重定向请求次数
|
||||
*/
|
||||
public int maxRedirectCount() {
|
||||
return maxRedirectCount;
|
||||
public int maxRedirects() {
|
||||
return maxRedirects;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -412,11 +412,11 @@ public class Request implements HeaderOperation<Request> {
|
||||
* 如果次数小于1则表示不重定向,大于等于1表示打开重定向<br>
|
||||
* 注意:当{@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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建请求配置,包括连接请求超时和响应(读取)超时
|
||||
*
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -594,7 +594,7 @@ public class SoapClient implements HeaderOperation<SoapClient> {
|
||||
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));
|
||||
|
@ -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());
|
||||
|
@ -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()));
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user