All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.idea360.commons.http.apache.ApacheHttpClientWrapper Maven / Gradle / Ivy

package cn.idea360.commons.http.apache;

import cn.idea360.commons.http.HttpClientWrapper;
import cn.idea360.commons.http.HttpConfig;
import cn.idea360.commons.http.Request;
import cn.idea360.commons.http.Response;
import lombok.extern.slf4j.Slf4j;
import org.apache.hc.client5.http.ConnectTimeoutException;
import org.apache.hc.client5.http.classic.methods.*;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.DefaultHttpRequestRetryStrategy;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.http.*;
import org.apache.hc.core5.http.io.entity.StringEntity;
import org.apache.hc.core5.http.message.BasicHeader;
import org.apache.hc.core5.http.message.BasicNameValuePair;
import org.apache.hc.core5.net.URIBuilder;
import org.apache.hc.core5.util.TimeValue;

import java.io.IOException;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * @author cuishiying
 */
@Slf4j
public class ApacheHttpClientWrapper implements HttpClientWrapper {

	private final CloseableHttpClient httpClient;

	/**
	 * 默认构造方法, 默认配置
	 */
	public ApacheHttpClientWrapper() {
		this(new HttpConfig());
	}

	/**
	 * 构造方法, 允许自定义配置
	 * @param httpConfig http配置
	 */
	public ApacheHttpClientWrapper(HttpConfig httpConfig) {
		this(httpConfig, null, null);
	}

	/**
	 * 构造方法, 允许拦截器
	 * @param httpConfig 配置
	 * @param requestInterceptor 请求拦截器
	 * @param responseInterceptor 响应拦截器
	 */
	@SuppressWarnings("all")
	public ApacheHttpClientWrapper(HttpConfig httpConfig, HttpRequestInterceptor requestInterceptor,
			HttpResponseInterceptor responseInterceptor) {
		if (Objects.isNull(httpConfig)) {
			httpConfig = new HttpConfig();
		}
		log.info("http配置: {}", httpConfig.toString());
		PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
		connectionManager.setMaxTotal(httpConfig.getMaxTotal());
		connectionManager.setDefaultMaxPerRoute(httpConfig.getDefaultMaxPerRoute());

		RequestConfig requestConfig = RequestConfig.custom()
				.setConnectTimeout(httpConfig.getConnectTimeout(), TimeUnit.MILLISECONDS)
				.setConnectionRequestTimeout(httpConfig.getConnectionRequestTimeout(), TimeUnit.MILLISECONDS)
				.setResponseTimeout(httpConfig.getSocketTimeout(), TimeUnit.MILLISECONDS).build();

		List
headers = new ArrayList<>(); headers.add(new BasicHeader(HttpHeaders.ACCEPT, "application/json")); headers.add(new BasicHeader(HttpHeaders.CONTENT_TYPE, "application/json")); HttpClientBuilder builder = HttpClients.custom().setDefaultHeaders(headers) .setConnectionManager(connectionManager).setDefaultRequestConfig(requestConfig); if (Objects.nonNull(requestInterceptor)) { builder.addRequestInterceptorFirst(requestInterceptor); } if (Objects.nonNull(responseInterceptor)) { builder.addResponseInterceptorFirst(responseInterceptor); } if (httpConfig.getMaxRetries() > 0) { builder.setRetryStrategy( new DefaultHttpRequestRetryStrategy(httpConfig.getMaxRetries(), TimeValue.ofSeconds(2))); } this.httpClient = builder.build(); log.info("httpclient初始化完成"); } @Override public Response get(Request request) throws IOException, URISyntaxException { URI uri = new URIBuilder(request.getUrl()).addParameters(convertParams(request.getParams())).build(); HttpUriRequestBase httpRequest = new HttpGet(uri); httpRequest.setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded"); addHeaders(httpRequest, request.getHeaders()); return executeRequest(httpRequest); } @Override public Response post(Request request) throws IOException, URISyntaxException { URI uri = new URIBuilder(request.getUrl()).addParameters(convertParams(request.getParams())).build(); HttpUriRequestBase httpRequest = new HttpPost(uri); addHeaders(httpRequest, request.getHeaders()); if (Objects.nonNull(request.getBody())) { httpRequest.setEntity(new StringEntity(request.getBody(), StandardCharsets.UTF_8)); } return executeRequest(httpRequest); } @Override public Response put(Request request) throws IOException, URISyntaxException { URI uri = new URIBuilder(request.getUrl()).addParameters(convertParams(request.getParams())).build(); HttpUriRequestBase httpRequest = new HttpPut(uri); addHeaders(httpRequest, request.getHeaders()); if (Objects.nonNull(request.getBody())) { httpRequest.setEntity(new StringEntity(request.getBody(), StandardCharsets.UTF_8)); } return executeRequest(httpRequest); } @Override public Response patch(Request request) throws IOException, URISyntaxException { URI uri = new URIBuilder(request.getUrl()).addParameters(convertParams(request.getParams())).build(); HttpUriRequestBase httpRequest = new HttpPatch(uri); addHeaders(httpRequest, request.getHeaders()); if (Objects.nonNull(request.getBody())) { httpRequest.setEntity(new StringEntity(request.getBody(), StandardCharsets.UTF_8)); } return executeRequest(httpRequest); } @Override public Response delete(Request request) throws IOException, URISyntaxException { URI uri = new URIBuilder(request.getUrl()).addParameters(convertParams(request.getParams())).build(); HttpUriRequestBase httpRequest = new HttpDelete(uri); httpRequest.setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded"); addHeaders(httpRequest, request.getHeaders()); return executeRequest(httpRequest); } @SuppressWarnings("all") private Response executeRequest(HttpUriRequestBase request) throws IOException { try (Response response = httpClient.execute(request, new CustomResponseHandler())) { return response; } catch (ConnectTimeoutException e) { log.error("Connection timeout: " + e.getMessage()); throw e; } catch (SocketTimeoutException e) { log.error("Socket timeout: " + e.getMessage()); throw e; } catch (IOException e) { log.error("I/O error: " + e.getMessage()); throw e; } catch (Exception e) { log.error("Unexpected error: " + e.getMessage()); throw new IOException("Unexpected error", e); } } private List convertParams(Map params) { if (Objects.nonNull(params)) { return params.entrySet().stream().map(e -> new BasicNameValuePair(e.getKey(), e.getValue().toString())) .collect(Collectors.toList()); } return List.of(); } private void addHeaders(HttpUriRequestBase request, Map headers) { if (Objects.nonNull(headers)) { headers.forEach((key, value) -> request.setHeader(new BasicHeader(key, value))); } } @Override public void close() throws IOException { httpClient.close(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy