HttpRequest.java 16.4 KB
Newer Older
如梦技术's avatar
如梦技术 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * Copyright (c) 2019-2029, Dreamlu (596392912@qq.com & www.dreamlu.net).
 * <p>
 * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.gnu.org/licenses/lgpl.html
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

17
package net.dreamlu.mica.http;
如梦技术's avatar
如梦技术 已提交
18

19 20
import net.dreamlu.mica.core.retry.IRetry;
import net.dreamlu.mica.core.retry.SimpleRetry;
如梦技术's avatar
如梦技术 已提交
21 22 23 24
import net.dreamlu.mica.core.ssl.DisableValidationTrustManager;
import net.dreamlu.mica.core.ssl.TrustAllHostNames;
import net.dreamlu.mica.core.utils.Exceptions;
import net.dreamlu.mica.core.utils.Holder;
如梦技术's avatar
如梦技术 已提交
25
import net.dreamlu.mica.core.utils.JsonUtil;
如梦技术's avatar
如梦技术 已提交
26
import net.dreamlu.mica.core.utils.StringPool;
如梦技术's avatar
如梦技术 已提交
27
import okhttp3.*;
28
import okhttp3.internal.Util;
如梦技术's avatar
如梦技术 已提交
29 30 31
import okhttp3.internal.http.HttpMethod;
import okhttp3.logging.HttpLoggingInterceptor;

32
import javax.annotation.Nullable;
33 34 35 36
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.X509TrustManager;
如梦技术's avatar
如梦技术 已提交
37
import java.net.InetSocketAddress;
如梦技术's avatar
如梦技术 已提交
38
import java.net.Proxy;
如梦技术's avatar
如梦技术 已提交
39
import java.net.ProxySelector;
如梦技术's avatar
如梦技术 已提交
40
import java.net.URI;
如梦技术's avatar
如梦技术 已提交
41 42
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
如梦技术's avatar
如梦技术 已提交
43
import java.time.Duration;
44 45
import java.util.ArrayList;
import java.util.List;
46
import java.util.Map;
47
import java.util.Objects;
48
import java.util.concurrent.CompletableFuture;
如梦技术's avatar
如梦技术 已提交
49
import java.util.concurrent.TimeUnit;
50
import java.util.function.Consumer;
51
import java.util.function.Predicate;
如梦技术's avatar
如梦技术 已提交
52 53 54 55 56 57

/**
 * ok http 封装,请求结构体
 *
 * @author L.cm
 */
58
public class HttpRequest {
如梦技术's avatar
如梦技术 已提交
59
	private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36";
如梦技术's avatar
如梦技术 已提交
60
	private static final MediaType APPLICATION_JSON = MediaType.get("application/json;charset=UTF-8");
如梦技术's avatar
如梦技术 已提交
61
	private static volatile OkHttpClient httpClient = new OkHttpClient();
62
	@Nullable
63
	private static HttpLoggingInterceptor globalLoggingInterceptor = null;
如梦技术's avatar
如梦技术 已提交
64
	private final Request.Builder requestBuilder;
65
	private final HttpUrl.Builder uriBuilder;
如梦技术's avatar
如梦技术 已提交
66 67
	private final String httpMethod;
	private String userAgent;
68
	@Nullable
如梦技术's avatar
如梦技术 已提交
69
	private RequestBody requestBody;
70
	@Nullable
如梦技术's avatar
如梦技术 已提交
71
	private Boolean followRedirects;
72
	@Nullable
73
	private Boolean followSslRedirects;
74
	@Nullable
如梦技术's avatar
如梦技术 已提交
75
	private HttpLoggingInterceptor.Logger logger;
76 77
	@Nullable
	private HttpLoggingInterceptor.Level logLevel;
78
	@Nullable
79
	private CookieJar cookieJar;
80
	@Nullable
81
	private EventListener eventListener;
82
	private final List<Interceptor> interceptors = new ArrayList<>();
83
	@Nullable
84
	private Authenticator authenticator;
85
	@Nullable
如梦技术's avatar
如梦技术 已提交
86
	private Duration connectTimeout;
87
	@Nullable
如梦技术's avatar
如梦技术 已提交
88
	private Duration readTimeout;
89
	@Nullable
如梦技术's avatar
如梦技术 已提交
90
	private Duration writeTimeout;
91
	@Nullable
92 93
	private List<Protocol> protocols;
	@Nullable
如梦技术's avatar
如梦技术 已提交
94
	private Proxy proxy;
95
	@Nullable
如梦技术's avatar
如梦技术 已提交
96
	private ProxySelector proxySelector;
97
	@Nullable
如梦技术's avatar
如梦技术 已提交
98
	private Authenticator proxyAuthenticator;
99
	@Nullable
100 101 102
	private IRetry retry;
	@Nullable
	private Predicate<ResponseSpec> respPredicate;
103
	@Nullable
如梦技术's avatar
如梦技术 已提交
104 105
	private Boolean disableSslValidation;
	@Nullable
如梦技术's avatar
如梦技术 已提交
106
	private HostnameVerifier hostnameVerifier;
107
	@Nullable
如梦技术's avatar
如梦技术 已提交
108
	private SSLSocketFactory sslSocketFactory;
109
	@Nullable
如梦技术's avatar
如梦技术 已提交
110
	private X509TrustManager trustManager;
如梦技术's avatar
如梦技术 已提交
111

112
	public static HttpRequest get(final String url) {
如梦技术's avatar
如梦技术 已提交
113
		return new HttpRequest(new Request.Builder(), url, Method.GET);
如梦技术's avatar
如梦技术 已提交
114 115
	}

116
	public static HttpRequest get(final URI uri) {
如梦技术's avatar
如梦技术 已提交
117
		return get(uri.toString());
如梦技术's avatar
如梦技术 已提交
118 119
	}

120
	public static HttpRequest post(final String url) {
如梦技术's avatar
如梦技术 已提交
121
		return new HttpRequest(new Request.Builder(), url, Method.POST);
如梦技术's avatar
如梦技术 已提交
122 123
	}

124
	public static HttpRequest post(final URI uri) {
如梦技术's avatar
如梦技术 已提交
125
		return post(uri.toString());
如梦技术's avatar
如梦技术 已提交
126 127
	}

128
	public static HttpRequest patch(final String url) {
如梦技术's avatar
如梦技术 已提交
129
		return new HttpRequest(new Request.Builder(), url, Method.PATCH);
如梦技术's avatar
如梦技术 已提交
130 131
	}

132
	public static HttpRequest patch(final URI uri) {
如梦技术's avatar
如梦技术 已提交
133
		return patch(uri.toString());
如梦技术's avatar
如梦技术 已提交
134 135
	}

136
	public static HttpRequest put(final String url) {
如梦技术's avatar
如梦技术 已提交
137
		return new HttpRequest(new Request.Builder(), url, Method.PUT);
如梦技术's avatar
如梦技术 已提交
138 139
	}

140
	public static HttpRequest put(final URI uri) {
如梦技术's avatar
如梦技术 已提交
141
		return put(uri.toString());
如梦技术's avatar
如梦技术 已提交
142 143
	}

144
	public static HttpRequest delete(final String url) {
如梦技术's avatar
如梦技术 已提交
145
		return new HttpRequest(new Request.Builder(), url, Method.DELETE);
如梦技术's avatar
如梦技术 已提交
146 147
	}

148
	public static HttpRequest delete(final URI uri) {
如梦技术's avatar
如梦技术 已提交
149
		return delete(uri.toString());
如梦技术's avatar
如梦技术 已提交
150 151
	}

152 153 154 155 156 157 158 159 160 161 162 163
	public HttpRequest pathParam(String name, Object value) {
		Objects.requireNonNull(name, "name == null");
		List<String> segments = this.uriBuilder.build().pathSegments();
		String pathParamName = '{' + name.trim() + '}';
		for (int i = 0; i < segments.size(); i++) {
			if (pathParamName.equalsIgnoreCase(segments.get(i))) {
				uriBuilder.setPathSegment(i, handleValue(value));
			}
		}
		return this;
	}

164 165
	public HttpRequest query(String query) {
		this.uriBuilder.query(query);
如梦技术's avatar
如梦技术 已提交
166 167 168
		return this;
	}

如梦技术's avatar
如梦技术 已提交
169
	public HttpRequest queryEncoded(String encodedQuery) {
170 171 172 173
		this.uriBuilder.encodedQuery(encodedQuery);
		return this;
	}

174
	public HttpRequest queryMap(@Nullable Map<String, Object> queryMap) {
175 176 177 178 179 180
		if (queryMap != null && !queryMap.isEmpty()) {
			queryMap.forEach(this::query);
		}
		return this;
	}

如梦技术's avatar
如梦技术 已提交
181
	public HttpRequest query(String name, @Nullable Object value) {
182 183 184 185
		this.uriBuilder.addQueryParameter(name, value == null ? null : String.valueOf(value));
		return this;
	}

如梦技术's avatar
如梦技术 已提交
186 187
	public HttpRequest queryEncoded(String encodedName, @Nullable Object encodedValue) {
		this.uriBuilder.addEncodedQueryParameter(encodedName, encodedValue == null ? null : String.valueOf(encodedValue));
如梦技术's avatar
如梦技术 已提交
188 189 190
		return this;
	}

191
	HttpRequest form(FormBody formBody) {
如梦技术's avatar
如梦技术 已提交
192 193 194 195
		this.requestBody = formBody;
		return this;
	}

196
	HttpRequest multipartForm(MultipartBody multipartBody) {
如梦技术's avatar
如梦技术 已提交
197 198 199 200
		this.requestBody = multipartBody;
		return this;
	}

201 202
	public FormBuilder formBuilder() {
		return new FormBuilder(this);
如梦技术's avatar
如梦技术 已提交
203 204
	}

205 206
	public MultipartFormBuilder multipartFormBuilder() {
		return new MultipartFormBuilder(this);
如梦技术's avatar
如梦技术 已提交
207 208
	}

209
	public HttpRequest body(RequestBody requestBody) {
如梦技术's avatar
如梦技术 已提交
210 211 212 213
		this.requestBody = requestBody;
		return this;
	}

214
	public HttpRequest bodyString(String body) {
如梦技术's avatar
如梦技术 已提交
215
		this.requestBody = RequestBody.create(APPLICATION_JSON, body);
如梦技术's avatar
如梦技术 已提交
216 217 218
		return this;
	}

如梦技术's avatar
如梦技术 已提交
219
	public HttpRequest bodyString(MediaType contentType, String body) {
如梦技术's avatar
如梦技术 已提交
220
		this.requestBody = RequestBody.create(contentType, body);
如梦技术's avatar
如梦技术 已提交
221 222 223
		return this;
	}

224
	public HttpRequest bodyJson(Object body) {
如梦技术's avatar
如梦技术 已提交
225 226 227
		return bodyString(JsonUtil.toJson(body));
	}

如梦技术's avatar
如梦技术 已提交
228 229
	private HttpRequest(final Request.Builder requestBuilder, String url, String httpMethod) {
		HttpUrl httpUrl = HttpUrl.parse(url);
230 231 232
		if (httpUrl == null) {
			throw new IllegalArgumentException(String.format("Url 不能解析: %s: [%s]。", httpMethod.toLowerCase(), url));
		}
如梦技术's avatar
如梦技术 已提交
233
		this.requestBuilder = requestBuilder;
234
		this.uriBuilder = httpUrl.newBuilder();
如梦技术's avatar
如梦技术 已提交
235 236 237 238
		this.httpMethod = httpMethod;
		this.userAgent = DEFAULT_USER_AGENT;
	}

239
	private Call internalCall(final OkHttpClient client) {
如梦技术's avatar
如梦技术 已提交
240
		OkHttpClient.Builder builder = client.newBuilder();
241 242
		if (connectTimeout != null) {
			builder.connectTimeout(connectTimeout.toMillis(), TimeUnit.MILLISECONDS);
如梦技术's avatar
如梦技术 已提交
243
		}
244 245
		if (readTimeout != null) {
			builder.readTimeout(readTimeout.toMillis(), TimeUnit.MILLISECONDS);
如梦技术's avatar
如梦技术 已提交
246
		}
247 248
		if (writeTimeout != null) {
			builder.writeTimeout(writeTimeout.toMillis(), TimeUnit.MILLISECONDS);
如梦技术's avatar
如梦技术 已提交
249
		}
250 251 252
		if (protocols != null && !protocols.isEmpty()) {
			builder.protocols(protocols);
		}
253 254
		if (proxy != null) {
			builder.proxy(proxy);
如梦技术's avatar
如梦技术 已提交
255
		}
256 257
		if (proxySelector != null) {
			builder.proxySelector(proxySelector);
如梦技术's avatar
如梦技术 已提交
258
		}
259
		if (proxyAuthenticator != null) {
如梦技术's avatar
如梦技术 已提交
260 261
			builder.proxyAuthenticator(proxyAuthenticator);
		}
262
		if (hostnameVerifier != null) {
如梦技术's avatar
如梦技术 已提交
263 264
			builder.hostnameVerifier(hostnameVerifier);
		}
265
		if (sslSocketFactory != null && trustManager != null) {
如梦技术's avatar
如梦技术 已提交
266 267
			builder.sslSocketFactory(sslSocketFactory, trustManager);
		}
如梦技术's avatar
如梦技术 已提交
268 269 270
		if (Boolean.TRUE.equals(disableSslValidation)) {
			disableSslValidation(builder);
		}
271
		if (authenticator != null) {
272 273
			builder.authenticator(authenticator);
		}
274 275
		if (eventListener != null) {
			builder.eventListener(eventListener);
如梦技术's avatar
如梦技术 已提交
276
		}
277 278 279 280
		if (!interceptors.isEmpty()) {
			builder.interceptors().addAll(interceptors);
		}
		if (cookieJar != null) {
281 282
			builder.cookieJar(cookieJar);
		}
283 284
		if (followRedirects != null) {
			builder.followRedirects(followRedirects);
285
		}
286 287
		if (followSslRedirects != null) {
			builder.followSslRedirects(followSslRedirects);
如梦技术's avatar
如梦技术 已提交
288
		}
289 290
		if (retry != null) {
			builder.addInterceptor(new RetryInterceptor(retry, respPredicate));
291
		}
如梦技术's avatar
如梦技术 已提交
292 293
		if (logger != null && logLevel != null && HttpLoggingInterceptor.Level.NONE != logLevel) {
			builder.addInterceptor(getLoggingInterceptor(logger, logLevel));
294 295 296
		} else if (globalLoggingInterceptor != null) {
			builder.addInterceptor(globalLoggingInterceptor);
		}
如梦技术's avatar
如梦技术 已提交
297
		// 设置 User-Agent
298
		requestBuilder.header("User-Agent", userAgent);
如梦技术's avatar
如梦技术 已提交
299
		// url
300
		requestBuilder.url(uriBuilder.build());
301
		String method = httpMethod;
如梦技术's avatar
如梦技术 已提交
302 303
		Request request;
		if (HttpMethod.requiresRequestBody(method) && requestBody == null) {
304
			request = requestBuilder.method(method, Util.EMPTY_REQUEST).build();
如梦技术's avatar
如梦技术 已提交
305
		} else {
306
			request = requestBuilder.method(method, requestBody).build();
如梦技术's avatar
如梦技术 已提交
307
		}
308
		return builder.build().newCall(request);
如梦技术's avatar
如梦技术 已提交
309 310
	}

如梦技术's avatar
如梦技术 已提交
311 312
	public Exchange execute() {
		return new Exchange(internalCall(httpClient));
313 314
	}

315 316
	public AsyncExchange async() {
		return new AsyncExchange(internalCall(httpClient));
317 318
	}

319 320 321 322 323 324 325 326 327 328 329
	public CompletableFuture<ResponseSpec> executeAsync() {
		CompletableFuture<ResponseSpec> future = new CompletableFuture<>();
		Call call = internalCall(httpClient);
		call.enqueue(new CompletableCallback(future));
		return future;
	}

	public ResponseSpec executeAsyncAndJoin() {
		return executeAsync().join();
	}

330 331 332 333 334
	public HttpRequest baseAuth(String userName, String password) {
		this.authenticator = new BaseAuthenticator(userName, password);
		return this;
	}

如梦技术's avatar
如梦技术 已提交
335
	//// HTTP header operations
336 337 338 339 340 341
	public HttpRequest addHeader(final Map<String, String> headers) {
		this.requestBuilder.headers(Headers.of(headers));
		return this;
	}

	public HttpRequest addHeader(final String... namesAndValues) {
如梦技术's avatar
如梦技术 已提交
342 343 344 345 346
		Headers headers = Headers.of(namesAndValues);
		this.requestBuilder.headers(headers);
		return this;
	}

347
	public HttpRequest addHeader(final String name, final String value) {
如梦技术's avatar
如梦技术 已提交
348 349 350 351
		this.requestBuilder.addHeader(name, value);
		return this;
	}

352
	public HttpRequest setHeader(final String name, final String value) {
如梦技术's avatar
如梦技术 已提交
353 354 355 356
		this.requestBuilder.header(name, value);
		return this;
	}

357
	public HttpRequest removeHeader(final String name) {
如梦技术's avatar
如梦技术 已提交
358 359 360 361
		this.requestBuilder.removeHeader(name);
		return this;
	}

362 363 364 365 366
	public HttpRequest addCookie(final Cookie cookie) {
		this.addHeader("Cookie", cookie.toString());
		return this;
	}

367 368 369 370 371 372 373
	public HttpRequest addCookie(Consumer<Cookie.Builder> consumer) {
		Cookie.Builder builder = new Cookie.Builder();
		consumer.accept(builder);
		this.addHeader("Cookie", builder.build().toString());
		return this;
	}

374
	public HttpRequest cacheControl(final CacheControl cacheControl) {
如梦技术's avatar
如梦技术 已提交
375 376 377 378
		this.requestBuilder.cacheControl(cacheControl);
		return this;
	}

379
	public HttpRequest userAgent(final String userAgent) {
如梦技术's avatar
如梦技术 已提交
380 381 382 383
		this.userAgent = userAgent;
		return this;
	}

384
	public HttpRequest followRedirects(boolean followRedirects) {
如梦技术's avatar
如梦技术 已提交
385 386 387 388
		this.followRedirects = followRedirects;
		return this;
	}

389 390 391 392 393
	public HttpRequest followSslRedirects(boolean followSslRedirects) {
		this.followSslRedirects = followSslRedirects;
		return this;
	}

如梦技术's avatar
如梦技术 已提交
394 395 396
	private static HttpLoggingInterceptor getLoggingInterceptor(HttpLoggingInterceptor.Logger httpLogger,
																HttpLoggingInterceptor.Level level) {
		HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(httpLogger);
如梦技术's avatar
如梦技术 已提交
397 398 399 400
		loggingInterceptor.setLevel(level);
		return loggingInterceptor;
	}

401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
	public HttpRequest useSlf4jLog() {
		return useSlf4jLog(LogLevel.BODY);
	}

	public HttpRequest useSlf4jLog(LogLevel logLevel) {
		return useLog(HttpLogger.Slf4j, logLevel);
	}

	public HttpRequest useConsoleLog() {
		return useConsoleLog(LogLevel.BODY);
	}

	public HttpRequest useConsoleLog(LogLevel logLevel) {
		return useLog(HttpLogger.Console, logLevel);
	}

如梦技术's avatar
如梦技术 已提交
417 418
	public HttpRequest useLog(HttpLoggingInterceptor.Logger logger, LogLevel logLevel) {
		this.logger = logger;
419
		this.logLevel = logLevel.getLevel();
如梦技术's avatar
如梦技术 已提交
420 421 422
		return this;
	}

423 424 425 426 427
	public HttpRequest authenticator(Authenticator authenticator) {
		this.authenticator = authenticator;
		return this;
	}

428 429 430 431 432
	public HttpRequest eventListener(EventListener eventListener) {
		this.eventListener = eventListener;
		return this;
	}

433
	public HttpRequest interceptor(Interceptor interceptor) {
434
		this.interceptors.add(interceptor);
如梦技术's avatar
如梦技术 已提交
435 436 437
		return this;
	}

438 439 440 441 442
	public HttpRequest cookieManager(CookieJar cookieJar) {
		this.cookieJar = cookieJar;
		return this;
	}

如梦技术's avatar
如梦技术 已提交
443
	//// HTTP connection parameter operations
444
	public HttpRequest connectTimeout(final Duration timeout) {
如梦技术's avatar
如梦技术 已提交
445 446 447 448
		this.connectTimeout = timeout;
		return this;
	}

449
	public HttpRequest readTimeout(Duration readTimeout) {
如梦技术's avatar
如梦技术 已提交
450 451 452 453
		this.readTimeout = readTimeout;
		return this;
	}

454
	public HttpRequest writeTimeout(Duration writeTimeout) {
如梦技术's avatar
如梦技术 已提交
455 456 457 458
		this.writeTimeout = writeTimeout;
		return this;
	}

459 460 461 462 463
	public HttpRequest protocols(List<Protocol> protocols) {
		this.protocols = protocols;
		return this;
	}

464 465
	public HttpRequest proxy(Proxy proxy) {
		this.proxy = proxy;
如梦技术's avatar
如梦技术 已提交
466 467 468
		return this;
	}

469 470 471 472 473 474 475 476
	public HttpRequest proxy(final Proxy.Type type, final InetSocketAddress address) {
		return proxy(new Proxy(type, address));
	}

	public HttpRequest proxy(final InetSocketAddress address) {
		return proxy(Proxy.Type.HTTP, address);
	}

477 478 479
	public HttpRequest proxy(final String hostname, final int port) {
		return proxy(InetSocketAddress.createUnresolved(hostname, port));
	}
480

如梦技术's avatar
如梦技术 已提交
481 482 483 484 485 486 487 488 489 490
	public HttpRequest proxySelector(final ProxySelector proxySelector) {
		this.proxySelector = proxySelector;
		return this;
	}

	public HttpRequest proxyAuthenticator(final Authenticator proxyAuthenticator) {
		this.proxyAuthenticator = proxyAuthenticator;
		return this;
	}

491
	public HttpRequest retry() {
492
		return retry(new SimpleRetry());
493 494
	}

495
	public HttpRequest retryOn(Predicate<ResponseSpec> respPredicate) {
496
		return retry(new SimpleRetry(), respPredicate);
497 498
	}

499
	public HttpRequest retry(int maxAttempts, long sleepMillis) {
500
		return retry(new SimpleRetry(maxAttempts, sleepMillis));
501 502
	}

503
	public HttpRequest retry(int maxAttempts, long sleepMillis, Predicate<ResponseSpec> respPredicate) {
504 505 506 507 508 509 510 511 512 513 514
		return retry(new SimpleRetry(maxAttempts, sleepMillis), respPredicate);
	}

	public HttpRequest retry(IRetry retry) {
		this.retry = retry;
		return this;
	}

	public HttpRequest retry(IRetry retry, Predicate<ResponseSpec> respPredicate) {
		this.retry = retry;
		this.respPredicate = respPredicate;
515 516 517
		return this;
	}

如梦技术's avatar
如梦技术 已提交
518 519 520 521 522 523 524 525 526 527
	/**
	 * 关闭 ssl 校验
	 *
	 * @return HttpRequest
	 */
	public HttpRequest disableSslValidation() {
		this.disableSslValidation = Boolean.TRUE;
		return this;
	}

如梦技术's avatar
如梦技术 已提交
528 529 530 531 532 533 534 535 536 537 538
	public HttpRequest hostnameVerifier(HostnameVerifier hostnameVerifier) {
		this.hostnameVerifier = hostnameVerifier;
		return this;
	}

	public HttpRequest sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager) {
		this.sslSocketFactory = sslSocketFactory;
		this.trustManager = trustManager;
		return this;
	}

如梦技术's avatar
如梦技术 已提交
539 540 541 542 543 544
	@Override
	public String toString() {
		return requestBuilder.toString();
	}

	public static void setHttpClient(OkHttpClient httpClient) {
545
		HttpRequest.httpClient = httpClient;
如梦技术's avatar
如梦技术 已提交
546
	}
如梦技术's avatar
如梦技术 已提交
547

548 549 550 551 552
	/**
	 * 设置全局日志,默认:Slf4j
	 *
	 * @param logLevel LogLevel
	 */
如梦技术's avatar
如梦技术 已提交
553
	public static void setGlobalLog(LogLevel logLevel) {
554 555 556
		setGlobalLog(HttpLogger.Slf4j, logLevel);
	}

如梦技术's avatar
如梦技术 已提交
557
	public static void setGlobalLog(HttpLoggingInterceptor.Logger logger, LogLevel logLevel) {
558
		HttpRequest.globalLoggingInterceptor = getLoggingInterceptor(logger, logLevel.getLevel());
如梦技术's avatar
如梦技术 已提交
559
	}
如梦技术's avatar
如梦技术 已提交
560 561 562 563 564 565 566 567 568 569

	static String handleValue(@Nullable Object value) {
		if (value == null) {
			return StringPool.EMPTY;
		}
		if (value instanceof String) {
			return (String) value;
		}
		return String.valueOf(value);
	}
如梦技术's avatar
如梦技术 已提交
570 571 572

	private static void disableSslValidation(OkHttpClient.Builder builder) {
		try {
如梦技术's avatar
如梦技术 已提交
573
			DisableValidationTrustManager disabledTrustManager = DisableValidationTrustManager.INSTANCE;
如梦技术's avatar
如梦技术 已提交
574
			SSLContext sslContext = SSLContext.getInstance("SSL");
如梦技术's avatar
如梦技术 已提交
575
			sslContext.init(null, disabledTrustManager.getTrustManagers(), Holder.SECURE_RANDOM);
如梦技术's avatar
如梦技术 已提交
576 577 578 579 580 581 582
			SSLSocketFactory disabledSslSocketFactory = sslContext.getSocketFactory();
			builder.sslSocketFactory(disabledSslSocketFactory, disabledTrustManager);
			builder.hostnameVerifier(TrustAllHostNames.INSTANCE);
		} catch (NoSuchAlgorithmException | KeyManagementException e) {
			throw Exceptions.unchecked(e);
		}
	}
如梦技术's avatar
如梦技术 已提交
583
}