Skip to content

Instantly share code, notes, and snippets.

@guozi
Forked from liujbo/HttpUtil.java
Created March 28, 2022 13:29
Show Gist options
  • Save guozi/c1c5c6d8c94c85a55ab8f17594bf35c5 to your computer and use it in GitHub Desktop.
Save guozi/c1c5c6d8c94c85a55ab8f17594bf35c5 to your computer and use it in GitHub Desktop.
HTTP请求工具
package com.xilai.cuteBoy.common.util;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
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.BufferedHttpEntity;
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.util.EntityUtils;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.*;
/*************************************************************
* Description: HttpClient 4.5 Utils
* Author: Liu Junbo
* CreateTime: 2017/6/7
************************************************************/
public class HttpUtil {
private static Certificate cert = null;
private static SSLConnectionSocketFactory socketFactory;//私密连接工厂
private static TrustManager manager = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
/**
* 是否忽略证书.https网站一般情况下使用了安全系数较低的SHA-1签名,因此首先我们在调用SSL之前需要重写验证方法,取消检测SSL。
*/
private static void enableSSl(boolean isIgnore) {
try {
SSLContext context = SSLContext.getInstance("TLS");
if (isIgnore) {
context.init(null, new TrustManager[]{manager}, null);
} else {
context.init(null, new TrustManager[]{httpsManager}, null);
}
socketFactory = new SSLConnectionSocketFactory(context, NoopHostnameVerifier
.INSTANCE);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
/**
* 证书获取
*
* @param certificateUrl 证书地址.
*/
private static void initHttpsCertificate(String certificateUrl) {
try {
FileInputStream fis = new FileInputStream(certificateUrl);
BufferedInputStream bis = new BufferedInputStream(fis);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
cert = cf.generateCertificate(bis);
}
bis.close();
} catch (IOException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
}
}
private static TrustManager httpsManager = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{(X509Certificate) cert};
}
};
/**
* httpClient get http 请求.
*
* @param url 请求路径.
* @param values 请求参数.
* @return response 请求结果状态.
*/
public static String doGet(String url, List<NameValuePair> values) throws IOException {
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).build();
//最新版的httpClient使用实现类的是closeableHTTPClient,以前的default作废了.设置可关闭的httpclient
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(config).build();
StringBuilder urlBuffer = new StringBuilder(url);
if (!url.contains("?")) {
urlBuffer.append("?");
}
if (values != null) {
for (NameValuePair nameValuePair : values) {
urlBuffer.append("&").append(nameValuePair.getName()).append("=")
.append(URLEncoder.encode(nameValuePair.getValue(), "UTF-8"));
}
}
HttpGet get = new HttpGet(urlBuffer.toString());
CloseableHttpResponse response = httpClient.execute(get);
return getResponseContent(response);
}
/**
* httpClient post http 请求.
*
* @param url 请求路径.
* @param values 请求参数.
* @return response 请求结果状态.
*/
public static String doPost(String url, List<NameValuePair> values) throws IOException {
/*Map<String,String> paramMap = new HashMap<String, String>();
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
for (Map.Entry<String,String> entry : paramMap.entrySet()){
formParams.add(new BasicNameValuePair(entry.getKey(),entry.getValue()));
}*/
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).build();
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(config).build();
HttpPost post = new HttpPost(url);
if (values != null) {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(values, "UTF-8");
//StringEntity entity = new StringEntity(values);
post.setEntity(entity);
}
CloseableHttpResponse response = httpClient.execute(post);
return getResponseContent(response);
}
/**
* httpClient post http 请求.
*
* @param url
* @param values
* @param charset
* @return
* @throws IOException
*/
public static String doPost(String url, List<NameValuePair> values, String charset) throws IOException {
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).build();
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(config).build();
HttpPost post = new HttpPost(url);
if (charset == null) {
charset = "UTF-8";
}
if (values != null) {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(values, charset);
//StringEntity entity = new StringEntity(values);
post.setEntity(entity);
}
CloseableHttpResponse response = httpClient.execute(post);
return getResponseContent(response);
}
/**
* httpClient get https 请求.
*
* @param url 请求路径.
* @param values 请求参数.
* @return response 请求结果状态.
*/
public static String ignoreGetForHttps(String url, List<NameValuePair> values, boolean isIgnoreSSL) throws
IOException {
enableSSl(isIgnoreSSL);
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT)
.setExpectContinueEnabled(true).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM,
AuthSchemes.DIGEST)).setProxyPreferredAuthSchemes(Collections.singletonList(AuthSchemes.BASIC))
.build();
//创建可用Scheme
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build();
//创建ConnectionManager,添加Connection配置信息
PoolingHttpClientConnectionManager connectionManager = new
PoolingHttpClientConnectionManager(socketFactoryRegistry);
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager)
.setDefaultRequestConfig(config).build();
StringBuilder urlBuffer = new StringBuilder(url);
if (!url.contains("?")) {
urlBuffer.append("?");
}
if (values != null) {
for (NameValuePair nameValuePair : values) {
urlBuffer.append("&").append(nameValuePair.getName()).append("=")
.append(URLEncoder.encode(nameValuePair.getValue(), "UTF-8"));
}
}
HttpGet get = new HttpGet(urlBuffer.toString());
CloseableHttpResponse response = httpClient.execute(get);
return getResponseContent(response);
}
/**
* httpClient get https 请求.
*
* @param url 请求路径.
* @return response 请求结果状态.
*/
public static String ignoreGetForHttps(String url, boolean isIgnoreSSL) throws
IOException {
enableSSl(isIgnoreSSL);
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT)
.setExpectContinueEnabled(true).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM,
AuthSchemes.DIGEST)).setProxyPreferredAuthSchemes(Collections.singletonList(AuthSchemes.BASIC))
.build();
//创建可用Scheme
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build();
//创建ConnectionManager,添加Connection配置信息
PoolingHttpClientConnectionManager connectionManager = new
PoolingHttpClientConnectionManager(socketFactoryRegistry);
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager)
.setDefaultRequestConfig(config).build();
HttpGet get = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(get);
return getResponseContent(response);
}
/**
* httpClient post https 请求.
*
* @param url 请求路径.
* @param values 请求参数.
* @return response 请求结果状态.
*/
public static String ignorePostForHttps(String url, List<NameValuePair> values, boolean isIgnoreSSL)
throws IOException {
enableSSl(isIgnoreSSL);
//首先设置全局的标准cookie策略
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT)
.setExpectContinueEnabled(true).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM,
AuthSchemes.DIGEST)).setProxyPreferredAuthSchemes(Collections.singletonList(AuthSchemes.BASIC))
.build();
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build();
PoolingHttpClientConnectionManager connectionManager = new
PoolingHttpClientConnectionManager(socketFactoryRegistry);
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager)
.setDefaultRequestConfig(config).build();
HttpPost post = new HttpPost(url);
if (values != null) {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(values, Charset.forName("UTF-8"));
post.setEntity(entity);
}
CloseableHttpResponse response = httpClient.execute(post);
return getResponseContent(response);
}
/**
* 获取请求返回值.
*/
private static String getResponseContent(CloseableHttpResponse response)
throws IOException {
StringBuilder returnBuffer = new StringBuilder();
BufferedReader reader = null;
try {
if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
HttpEntity httpEntity = response.getEntity();
httpEntity = new BufferedHttpEntity(httpEntity);
return EntityUtils.toString(httpEntity);
}
} finally {
response.close();
}
return null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment