直接上代码,记录一下
/**
* 用于Http请求相关的工具类
*/
public class HttpUtils {
/**
* http请求的返回码
*/
private static final int RESPONSE_SUCCESS_CODE = 200;
/**
* 是否是https协议请求
*/
private final static String HTTPS_URL_PREFIX = "https";
/**
* 判断当前url是否可以访问成功
* @param url 用于访问的url
* @return true:表示成功,false:表示失败
*/
public static boolean accessSuccess(String url) {
try {
return doGet(url);
} catch (Exception e) {
return false;
}
}
/**
* 采用get方式请求供应商接口
*
* @param url 供应商url
* @return 是否请求成功
* @throws Exception httpclient可能抛出异常
*/
private static boolean doGet(String url) throws Exception {
if (checkIsHttpsUrl(url)) {
try(CloseableHttpClient httpclient = createSslClient()) {
return processGet(url, httpclient);
}
} else {
try(CloseableHttpClient httpclient = HttpClients.createDefault()) {
return processGet(url,httpclient);
}
}
}
/**
* 执行GET请求
* @param url 请求地址
* @param httpclient 请求客户端
* @return true:请求成功,false:请求失败
*/
private static boolean processGet(String url, CloseableHttpClient httpclient){
HttpGet httpGet = new HttpGet(url);
// 设置httpclient请求超时时间
RequestConfig requestConfig = RequestConfig.custom()
// 默认连接超时100ms
.setConnectionRequestTimeout(100)
// 请求超时400ms
.setSocketTimeout(400)
.build();
// 具体执行请求
httpGet.setConfig(requestConfig);
return processRequest(httpclient, httpGet);
}
/**
* 根据传入的请求方式进行请求
*
* @param httpclient 请求客户端
* @param requestBase 请求方法 get、post、head
* @return true:请求成功,false:请求失败
*/
private static boolean processRequest(CloseableHttpClient httpclient, HttpRequestBase requestBase){
// 执行供应商接口请求
try (CloseableHttpResponse response = httpclient.execute(requestBase)) {
int code = response.getStatusLine().getStatusCode();
if (code > RESPONSE_SUCCESS_CODE) {
return false;
}
} catch (IOException e) {
return false;
}
return true;
}
/**
* http协议头前缀匹配
* @param url 请求url
* @return 返回是否是https协议
*/
private static boolean checkIsHttpsUrl(String url){
url = StringUtils.trim(url);
if (url.startsWith(HTTPS_URL_PREFIX)) {
return true;
} else {
return false;
}
}
/**
* 创建https client
*/
private static CloseableHttpClient createSslClient() {
RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
ConnectionSocketFactory plainSf = new PlainConnectionSocketFactory();
registryBuilder.register(PrivacyRecordingMccConfig.ProtocolConstant.HTTP, plainSf);
//指定信任密钥存储对象和连接套接字工厂
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
//信任任何链接
TrustStrategy anyTrustStrategy = new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] x509Certificates, String s){
return true;
}
};
SSLContext sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, anyTrustStrategy).build();
LayeredConnectionSocketFactory sslSf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
registryBuilder.register("https", sslSf);
} catch (KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) {
throw new RuntimeException(e);
}
Registry<ConnectionSocketFactory> registry = registryBuilder.build();
//设置连接管理器
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);
//构建客户端
return HttpClientBuilder.create().setConnectionManager(connManager).setDefaultHeaders(new ArrayList<Header>()).build();
}
}