HTTPS访问调用接口
总体思路
通过发送 https 请求,使用 GET 或者 POST 的方式,访问 url
https 请求与 http请求的区别
比起http 请求,https 请求多了一个信任管理器(X509TrustManager),可以通过这个信任管理器来过滤掉不需要的 url,从而保证了访问的安全性。
代码实现
信任管理器
首先定义一个信任管理器MyX509TrustManager(implements X509TrustManager)
package util;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
* 信任管理器
*
* @author sunzhi
* @date 2020/9/15
*/
public class MyX509TrustManager implements X509TrustManager {
// 检查客户端证书
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 检查服务器端证书
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 返回受信任的X509证书数组
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
这里不写任何内容就代表所有的 url 都可以访问。
第二步定义 HttpUtils类发送 HTTPS 请求
package util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HttpUtils {
private static Logger log = LoggerFactory.getLogger(HttpUtils.class);
/**
* 发送https请求
*
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
try {
// 创建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();
URL url= new URL(null, requestUrl, new sun.net.www.protocol.https.Handler());
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
log.error("连接超时:{}", ce);
} catch (Exception e) {
log.error("https请求异常:{}", e);
}
return jsonObject;
}
}
在这里面,首先通过创建SSLContext对象,并初始化我们的信任管理器,然后从SSLContext对象中得到获得的SSLSocketFactory对象
**另外注意41行的url配置要通过URL(null, requestUrl, new sun.net.www.protocol.https.Handler())**的方式去配置,不然会出错
接下来设置请求方式(GET/POST),输入流和输出流的处理方式,最后释放资源并返回一个json格式的对象。
接下来是测试访问url的方法
package com.demo;
import net.sf.json.JSONObject;
import util.HttpUtils;
import java.util.List;
import javax.annotation.Resource;
import javax.swing.plaf.synth.SynthScrollPaneUI;
import org.junit.Test;
import org.junit.jupiter.api.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import dao.SelectAllDao;
import dao.Impl.SelectAllDaoImpl;
import model.Product;
public class HttpsTest {
private static Logger log = LoggerFactory.getLogger(HttpsTest.class);
@Resource
private SelectAllDao selectAllDao;
public SelectAllDao getSelectAllDao() {
return selectAllDao;
}
public void setSelectAllDao(SelectAllDao selectAllDao) {
this.selectAllDao = selectAllDao;
}
@Test
public void HttpsTest(){
// 拼接请求地址
String requestUrl = "需要访问的url";
// 需要提交的json数据
String jsonData = "{}";
//发送请求获取结果
JSONObject jsonObject = HttpUtils.httpsRequest(requestUrl, "GET", jsonData);//通过GET方式请求url
System.out.println(jsonObject);
if (null != jsonObject) {
Object aaa = jsonObject.get("我这里获取了json数据中的数据“token”");
System.out.println(aaa.toString());}//打印token
版权声明:本文为moonicly原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。