-
-
Save guozi/c1c5c6d8c94c85a55ab8f17594bf35c5 to your computer and use it in GitHub Desktop.
HTTP请求工具
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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