https方式访问URL接口

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。