描述
使用HttpClient调取第三方接口可能存在调取加密接口,使用https传输方式。本篇文章以具体例子演示调用过程。
代码
- 实现X509TrustManager接口
import javax.net.ssl.X509TrustManager; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; /** * 证书信任管理器(用于https请求) * author: wing */ public class MyX509TrustManager implements 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 new X509Certificate[0]; } }
- 在普通调用时设置SSLsocket代理
/** * 向指定 URL 发送https/POST方法的请求 * * @param actionUrl:发送请求的 URL * @param params:请求参数,请求参数应该是 name1=value1&name2=value2 的形式,封装在body里进行发送 * @param headerMap:请求头 * @return String[result]:所代表远程资源的响应结果 */ public static String sendHttpsPostInBody(String actionUrl, String params, Map<String, String> headerMap) { String results = ""; try { String serverURL = actionUrl; StringBuffer sbf = new StringBuffer(); String strRead = null; URL url = new URL(serverURL); HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); // 创建SSLContext对象,并使用我们指定的信任管理器初始化 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); connection.setSSLSocketFactory(ssf); //请求post方式 connection.setRequestMethod("POST"); connection.setDoInput(true); connection.setDoOutput(true); //header内的的参数在这里set connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-Type", "application/json"); if(!CollectionUtils.isEmpty(headerMap)) { headerMap.forEach(connection::setRequestProperty); } connection.connect(); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(),"UTF-8"); //body参数放这里 writer.write(params); writer.flush(); InputStream is = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); while ((strRead = reader.readLine()) != null) { sbf.append(strRead); sbf.append("\r\n"); } reader.close(); connection.disconnect(); results = sbf.toString(); } catch (Exception e) { e.printStackTrace(); } return results; }