话不多说,上代码
1搞定https:
注入httpclient
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.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.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContexts;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
/**
* httpClient 交给spring管理 设置一些常用参数
*/
@Component("httpClient")
public class HttpClientFactoryBean implements FactoryBean<CloseableHttpClient>, InitializingBean, DisposableBean {
private CloseableHttpClient httpClient;
private int maxConnTotal = 1000;
private int maxConnPerRoute = 200;
@Override
public void destroy() throws Exception {
if (this.httpClient != null) {
try {
this.httpClient.close();
} catch (IOException e) {
}
}
}
@Override
public CloseableHttpClient getObject() throws Exception {
return this.httpClient;
}
@Override
public Class<?> getObjectType() {
return CloseableHttpClient.class;
}
@Override
public boolean isSingleton() {
return false;
}
@Override
public void afterPropertiesSet() throws Exception {
if (this.httpClient == null) {
try {
SSLContext sslcontext = SSLContexts.createDefault();
//证书 TrustAnyTrustManager 证书类 下面代码会有写到
sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, null);
SSLConnectionSocketFactory ssf = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE);
RequestConfig defaultRequestConfig = RequestConfig.custom().setSocketTimeout(300000).setConnectTimeout(350000).setConnectionRequestTimeout(320000).setCookieSpec(CookieSpecs.STANDARD_STRICT).setExpectContinueEnabled(true).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).build();
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.INSTANCE).register("https", ssf).build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
this.httpClient = HttpClients.custom().setConnectionManager(connectionManager).setDefaultRequestConfig(defaultRequestConfig).setMaxConnTotal(this.maxConnTotal).setMaxConnPerRoute(this.maxConnPerRoute).build();
} catch (KeyManagementException e) {
throw new IllegalArgumentException("can't create trustManager", e);
}
}
}
public void setMaxConnTotal(int maxConnTotal) {
this.maxConnTotal = maxConnTotal;
}
public void setMaxConnPerRoute(int maxConnPerRoute) {
this.maxConnPerRoute = maxConnPerRoute;
}
}
2 https 证书类
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* 信任所有证书
*/
public class TrustAnyTrustManager implements 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 new X509Certificate[]{};
}
}
3https应用
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Author:jzx
* 用于进行Https请求的HttpClient
*/
@Component("sslClient")
public class SSLClient {
@Resource(name = "httpClient")
CloseableHttpClient httpClient;
/**
* https post请求
*
* @param url
* @param json 里面包含你传递的File文件
* @return
* @throws IOException
*/
public String httpsPostFile(String url, JSON json) throws IOException {
HttpPost httpPost = new HttpPost(url);
//获取到你在json里面放的file
MultipartFile imageFile = (MultipartFile) json.get("image");
if(imageFile==null){
//file 空相应逻辑
return "";
}
InputStream in = imageFile.getInputStream();
InputStreamBody inputStreamBody = new InputStreamBody(in, "fileName");
MultipartEntity reqEntity = new MultipartEntity();
//这里的file就是你所传递的key 根据自己条件设置
reqEntity.addPart("file", inputStreamBody);
//设置其他需要传递的参数
Set<String> keys = json.keySet();
for (String key : keys) {
reqEntity.addPart(key, new StringBody(json.getString(key), StandardCharsets.UTF_8));
}
httpPost.setEntity(reqEntity);
//设置响应头
httpPost.setHeader("accept", "*/*");
httpPost.setHeader("connection", "Keep-Alive");
httpPost.setHeader("Accept", "application/json");
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, StandardCharsets.UTF_8);
return result;
}
3 应用
@Autowired
private SSLClient sslClient;
JSONObject param = new JSONObject();
//参数拼接
param.put("image", file);
param.put("mobile", mobile);
String result = "";
try {
//写你自己的url
result = sslClient.httpsPostFile("url", param);
} catch (IOException e) {
log.error("http 请求错误",e)
}
现在用的就是这个,开箱即用,别忘点赞 !