情况是这样的,公司是做支付业务的,所以有异步通知订单的业务,商户有https,http 都有的
但是有一些商户的https 一个证书对应多个域名的情况,亦或者自建证书,所有我们需要修改成视情况而定的放弃证书的校验
下面直接提出工具类
SSLClient 跳过证书校验返回 CloseableHttpClient
package http;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
//用于进行Https请求的HttpClient
public class SSLClient extends DefaultHttpClient{
public SSLClient() throws Exception{
super();
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null, new TrustManager[]{tm}, null);
//允许所有证书
SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager ccm = this.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", 443, ssf));
}
}
HTTP请求工具类,这个工具类基本的请求都包含了,也可以自行添加修改发送方式,如body方式等
目前是json 和map 的两种方式 有校验证书的,有不校验证书的,根据方法名就可以看出
下拉
package http;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.http.NameValuePair;
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.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class Httpclient {
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Httpclient.class);
public static final String METHOD_POST = "POST";
public static final String METHOD_GET = "GET";
public static final String CHARACTER_ENCODING = "UTF-8";
/**
*
* @param map 数据为map 范型 为Map
* @param url
* @param method
* @param timeout
* @return
* @throws Exception
*/
public static String sendRequestMethod(Map map, String url, String method, int timeout)
throws Exception {
// 创建默认的httpClient实例.
CloseableHttpClient httpclient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout * 1000)
.setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).build();
try {
List params = new ArrayList();
if (map != null) {
Set> entrySet = map.entrySet();
for (Map.Entry e : entrySet) {
String name = e.getKey();
String value = e.getValue();
NameValuePair pair = new BasicNameValuePair(name, value);
params.add(pair);
}
}
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(params, "UTF-8");
if (logger.isDebugEnabled()) {
logger.debug("http client url:" + url);
logger.debug("http client params:" + params.toString());
}
System.out.println("http client url:" + url);
System.out.println("http client params:" + params.toString());
HttpUriRequest reqMethod = null;
if (METHOD_POST.equalsIgnoreCase(method)) {
reqMethod = RequestBuilder.post().setUri(url)
// .setCharset(java.nio.charset.Charset.forName("UTF-8"))
// .addParameters(params.toArray(new
// BasicNameValuePair[params.size()]))
.setEntity(urlEncodedFormEntity).setConfig(requestConfig).build();
} else if (METHOD_GET.equalsIgnoreCase(method)) {
reqMethod = RequestBuilder.get().setUri(url).setEntity(urlEncodedFormEntity)
// .addParameters(params.toArray(new
// BasicNameValuePair[params.size()]))
.setConfig(requestConfig).build();
} else {
logger.warn("method unknow, return null.");
return null;
}
CloseableHttpResponse response = null;
if (httpclient != null)
response = httpclient.execute(reqMethod);
if (response != null && response.getStatusLine().getStatusCode() == 200)
return EntityUtils.toString(response.getEntity(), "UTF-8");
else {
if (response != null)
logger.warn("http response status error, status{}, return null"
+ response.getStatusLine().getStatusCode());
return null;
}
} catch (Exception e) {
logger.error(e.getMessage());
throw e;
} finally {
if (httpclient != null)
httpclient.close();
}
}
/**
*
* @param map 数据为map 范型 为Map map
* @param url
* @param method 大写 POST 或者 GET
* @param timeout int
* @return
* @throws Exception
*/
public static String sendRequestMethod(Map map, String url, String method) throws Exception {
int timeout = 60;
// 创建默认的httpClient实例.
CloseableHttpClient httpclient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout * 1000)
.setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).build();
try {
List params = new ArrayList();
if (map != null) {
Set> entrySet = map.entrySet();
for (Entry e : entrySet) {
String name = e.getKey();
String value = String.valueOf(e.getValue());
NameValuePair pair = new BasicNameValuePair(name, value);
params.add(pair);
}
}
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(params, "UTF-8");
if (logger.isDebugEnabled()) {
logger.debug("http client url:" + url);
logger.debug("http client params:" + params.toString());
}
System.out.println("http client url:" + url);
System.out.println("http client params:" + params.toString());
HttpUriRequest reqMethod = null;
if (METHOD_POST.equalsIgnoreCase(method)) {
reqMethod = RequestBuilder.post().setUri(url)
// .setCharset(java.nio.charset.Charset.forName("UTF-8"))
// .addParameters(params.toArray(new
// BasicNameValuePair[params.size()]))
.setEntity(urlEncodedFormEntity).setConfig(requestConfig).build();
} else if (METHOD_GET.equalsIgnoreCase(method)) {
reqMethod = RequestBuilder.get().setUri(url).setEntity(urlEncodedFormEntity)
// .addParameters(params.toArray(new
// BasicNameValuePair[params.size()]))
.setConfig(requestConfig).build();
} else {
logger.warn("method unknow, return null.");
return null;
}
CloseableHttpResponse response = null;
if (httpclient != null)
response = httpclient.execute(reqMethod);
if (response != null && response.getStatusLine().getStatusCode() == 200)
return EntityUtils.toString(response.getEntity(), "UTF-8");
else {
if (response != null)
logger.warn("http response status error, status{}, return null"
+ response.getStatusLine().getStatusCode());
return null;
}
} catch (Exception e) {
logger.error(e.getMessage());
throw e;
} finally {
if (httpclient != null)
httpclient.close();
}
}
/**
* 发送Https 并不校验证书
*
* @param url
* 地址
* @param Map 数据 Map
* @return
* @throws Exception
*/
public static String sendRequestNoCheckCerPostMap(String url, Map map) throws Exception {
int timeout = 60;
// 创建默认的httpClient实例.
CloseableHttpClient httpclient = new SSLClient();
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout * 1000)
.setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).build();
try {
List params = new ArrayList();
if (map != null) {
Set> entrySet = map.entrySet();
for (Entry e : entrySet) {
String name = e.getKey();
String value = String.valueOf(e.getValue());
NameValuePair pair = new BasicNameValuePair(name, value);
params.add(pair);
}
}
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(params, "UTF-8");
if (logger.isDebugEnabled()) {
logger.debug("http client url:" + url);
logger.debug("http client params:" + params.toString());
}
System.out.println("http client url:" + url);
System.out.println("http client params:" + params.toString());
HttpUriRequest reqMethod = null;
if (METHOD_POST.equalsIgnoreCase("POST")) {
reqMethod = RequestBuilder.post().setUri(url)
// .setCharset(java.nio.charset.Charset.forName("UTF-8"))
// .addParameters(params.toArray(new
// BasicNameValuePair[params.size()]))
.setEntity(urlEncodedFormEntity).setConfig(requestConfig).build();
} /*
* else if(METHOD_GET.equalsIgnoreCase(method)) { reqMethod =
* RequestBuilder.get().setUri(url)
* .setEntity(urlEncodedFormEntity)
* //.addParameters(params.toArray(new
* BasicNameValuePair[params.size()]))
* .setConfig(requestConfig).build(); }
*/else {
logger.warn("method unknow, return null.");
return null;
}
CloseableHttpResponse response = null;
if (httpclient != null)
response = httpclient.execute(reqMethod);
String string = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println("statusCode: " + response.getStatusLine().getStatusCode());
System.out.println("resp: " + string);
if (response != null && response.getStatusLine().getStatusCode() == 200)
return string;
else {
if (response != null)
logger.warn("http response status error, status{}, return null"
+ response.getStatusLine().getStatusCode());
return null;
}
} catch (Exception e) {
logger.error(e.getMessage());
throw e;
} finally {
if (httpclient != null)
httpclient.close();
}
}
/**
* 发送Https 并不校验证书
*
* @param url
* 地址
* @param json
* 数据
* @return
* @throws Exception
*/
public static String sendRequestNoCheckCerPostJOSNString(String url, String json) throws Exception {
// 创建默认的httpClient实例.
CloseableHttpClient httpclient = new SSLClient();
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60 * 1000).setConnectTimeout(60 * 1000)
.setConnectionRequestTimeout(60 * 1000).build();
HttpPost httpPost = new HttpPost(url);
try {
StringEntity entity = new StringEntity(json, "utf-8");// 解决中文乱码问题
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
if (logger.isDebugEnabled())
logger.debug("executing request :{}" + httpPost.getRequestLine());
HttpUriRequest reqMethod = RequestBuilder.post().setUri(url).setEntity(entity).setConfig(requestConfig)
.build();
CloseableHttpResponse response = null;
if (httpclient != null)
response = httpclient.execute(reqMethod);
if (response != null && response.getStatusLine().getStatusCode() == 200)
return EntityUtils.toString(response.getEntity(), "UTF-8");
else {
if (response != null)
logger.warn(" status code {} " + response.getStatusLine().getStatusCode());
logger.warn(" server error, return null");
return null;
}
} catch (Exception e) {
logger.error(e.getMessage());
throw e;
} finally {
if (httpclient != null)
httpclient.close();
}
}
/**
* post 请求 json 数据
*
* @param json
* JSON
* @param url
* 地址
* @param timeout
* 设置超时时间
* @return
* @throws Exception
*/
public static String sendJsonRequestMethod(String json, String url, int timeout) throws Exception {
// 创建默认的httpClient实例.
CloseableHttpClient httpclient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout * 1000)
.setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).build();
HttpPost httpPost = new HttpPost(url);
try {
StringEntity entity = new StringEntity(json, "utf-8");// 解决中文乱码问题
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
if (logger.isDebugEnabled())
logger.debug("executing request :{}" + httpPost.getRequestLine());
HttpUriRequest reqMethod = RequestBuilder.post().setUri(url).setEntity(entity).setConfig(requestConfig)
.build();
CloseableHttpResponse response = null;
if (httpclient != null)
response = httpclient.execute(reqMethod);
if (response != null && response.getStatusLine().getStatusCode() == 200)
return EntityUtils.toString(response.getEntity(), "UTF-8");
else {
if (response != null)
logger.warn(" status code {} " + response.getStatusLine().getStatusCode());
logger.warn(" server error, return null");
return null;
}
} catch (Exception e) {
logger.error(e.getMessage());
throw e;
} finally {
if (httpclient != null)
httpclient.close();
}
}
public static String ZX(String url, org.apache.commons.httpclient.NameValuePair[] data, String merId)
throws Exception {
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(url);
String result = null;
try {
postMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(60000);
httpClient.getHttpConnectionManager().getParams().setSoTimeout(60000);
postMethod.addRequestHeader("Xposp-Authorization", "noneed");
postMethod.addRequestHeader("Request-Source", merId);
// 将表单的值放入postMethod中
postMethod.setRequestBody(data);
int statusCode = httpClient.executeMethod(postMethod);
if (statusCode == 200) {
byte[] responseBody = postMethod.getResponseBody();
result = new String(responseBody, "utf-8");
System.out.println("[响应数据: " + result + "]");
} else {
postMethod.releaseConnection();
httpClient.getHttpConnectionManager().closeIdleConnections(0);
}
} catch (HttpException e) {
System.out.println("[Http请求异常]" + e);
return result;
} catch (IOException e) {
System.out.println("[I/O读写异常]" + e);
return result;
} finally {
// 释放链接
if (postMethod != null) {
try {
postMethod.releaseConnection();
httpClient.getHttpConnectionManager().closeIdleConnections(0);
} catch (Exception e) {
System.out.println("[Http应答异常]" + e);
}
}
}
return result;
}
}
都有注释,可以直接用