
cloud.agileframework.common.util.http.HttpUtil Maven / Gradle / Ivy
package cloud.agileframework.common.util.http;
import cloud.agileframework.common.constant.Constant;
import cloud.agileframework.common.util.clazz.TypeReference;
import cloud.agileframework.common.util.map.MapUtil;
import cloud.agileframework.common.util.object.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URI;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* @author 佟盟
* 日期 2019/11/7 18:11
* 描述 Http工具
* @version 1.0
* @since 1.0
*/
public class HttpUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class);
private static final String HTTPS_PREFIX = "https://";
private static final String HTTP_PREFIX = "http://";
/**
* get请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String get(String url) {
return send(Protocol.extract(url), RequestMethod.GET, url, null, null);
}
/**
* get请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String get(String url, Object header) {
return send(Protocol.extract(url), RequestMethod.GET, url, header, null);
}
/**
* get请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String get(String url, Object header, Object param) {
return send(Protocol.extract(url), RequestMethod.GET, url, header, param);
}
/**
* post请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String post(String url) {
return send(Protocol.extract(url), RequestMethod.POST, url, null, null);
}
/**
* post请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String post(String url, Object param) {
return send(Protocol.extract(url), RequestMethod.POST, url, null, param);
}
/**
* post请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String post(String url, Object header, Object param) {
return send(Protocol.extract(url), RequestMethod.POST, url, header, param);
}
/**
* put请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String put(String url) {
return send(Protocol.extract(url), RequestMethod.PUT, url, null, null);
}
/**
* put请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String put(String url, Object param) {
return send(Protocol.extract(url), RequestMethod.PUT, url, null, param);
}
/**
* put请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String put(String url, Object header, Object param) {
return send(Protocol.extract(url), RequestMethod.PUT, url, header, param);
}
/**
* get请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String delete(String url) {
return send(Protocol.extract(url), RequestMethod.DELETE, url, null, null);
}
/**
* get请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String delete(String url, Object param) {
return send(Protocol.extract(url), RequestMethod.DELETE, url, null, param);
}
/**
* get请求
*
* @param url 请求地址
* @return 返回的字符串
*/
public static String delete(String url, Object header, Object param) {
return send(Protocol.extract(url), RequestMethod.DELETE, url, header, param);
}
private static final Map MAPPING = Maps.newHashMap();
/**
* 发送请求
*
* @param protocol 协议
* @param method 方法
* @param url 地址
* @param header 请求头
* @param param 参数
* @return 相应信息
*/
public static CloseableHttpResponse originalSend(Protocol protocol, String var0, RequestMethod method, String url, Object header, Object param) {
final URI uri = URI.create(url);
int max = 10;
int count = max;
while (count > 0) {
try {
CloseableHttpClient httpClient = getHttpClient(protocol, var0);
HttpRequestBase httpRequestBase = getHttpRequestBase(method);
if (!MAPPING.isEmpty()) {
httpRequestBase.setConfig(RequestConfig.custom().setLocalAddress(MAPPING.get(uri.getHost())).build());
}
parseHeader(header, httpRequestBase);
url = parseParam(url, param, httpRequestBase);
url = parseUrl(protocol, url);
httpRequestBase.setURI(uri);
return httpClient.execute(httpRequestBase);
} catch (NotFoundRequestMethodException e) {
logger.error("第二个参数 method 未成功分析出请求方式", e);
return null;
} catch (ConnectException e) {
List localIpAddress = getLocalIpAddress();
final int index = max - count;
if (index > localIpAddress.size() - 1) {
logger.error("网络连接异常", e);
return null;
}
MAPPING.put(uri.getHost(), localIpAddress.get(index));
count--;
} catch (Exception e) {
logger.error("请求失败", e);
return null;
}
}
return null;
}
/**
* 获取本机的所有ip
*
* @return 本机ip列表
*/
public static List getLocalIpAddress() {
List ipList = new ArrayList<>();
Enumeration> interfaces;
try {
interfaces = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
return ipList;
}
while (interfaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) interfaces.nextElement();
Enumeration> ipAddressEnum = ni.getInetAddresses();
while (ipAddressEnum.hasMoreElements()) {
InetAddress address = (InetAddress) ipAddressEnum.nextElement();
if (address.isLoopbackAddress() || address.isLinkLocalAddress()) {
continue;
}
ipList.add(address);
}
}
return ipList;
}
public static String send(Protocol protocol, RequestMethod method, String url, Object header, Object param) {
return send(protocol, SSLConnectionSocketFactory.SSL, method, url, header, param);
}
/**
* 发送请求
*
* @param protocol 协议
* @param method 方法
* @param url 地址
* @param header 请求头
* @param param 参数
* @return 相应信息
*/
public static String send(Protocol protocol, String var0, RequestMethod method, String url, Object header, Object param) {
try (CloseableHttpResponse response = originalSend(protocol, var0, method, url, header, param)) {
return toStringContent(response);
} catch (Exception e) {
logger.error("请求失败", e);
}
return null;
}
/**
* 处理请求参数
*
* @param url 请求路径
* @param param 参数
* @param httpRequestBase 请求体
* @return 处理后的url
*/
private static String parseParam(String url, Object param, HttpRequestBase httpRequestBase) {
if (param != null && httpRequestBase instanceof HttpEntityEnclosingRequestBase) {
String content = param instanceof String ? (String) param : JSON.toJSONString(param);
Header contentType = httpRequestBase.getLastHeader(HTTP.CONTENT_TYPE);
if (contentType == null) {
contentType = new BasicHeader(HTTP.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());
httpRequestBase.setHeader(contentType);
}
Header connection = httpRequestBase.getLastHeader(HTTP.CONN_DIRECTIVE);
if (connection == null) {
connection = new BasicHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
httpRequestBase.setHeader(connection);
}
Header contentEncoding = httpRequestBase.getLastHeader(HTTP.CONTENT_ENCODING);
if (contentEncoding == null) {
contentEncoding = new BasicHeader(HTTP.CONTENT_ENCODING, ContentType.APPLICATION_JSON.getCharset().name());
httpRequestBase.setHeader(contentEncoding);
}
StringEntity entity = new StringEntity(content, ContentType.parse(contentType.getValue()));
entity.setContentType(contentType);
entity.setContentEncoding(contentEncoding);
((HttpEntityEnclosingRequestBase) httpRequestBase).setEntity(entity);
} else if (param != null) {
Map paramMap = ObjectUtil.to(param, new TypeReference
© 2015 - 2025 Weber Informatics LLC | Privacy Policy