`

java 通过HttpsUrlConnection访问接口数据

    博客分类:
  • java
 
阅读更多
server:
  ssl:
    key-store: classpath:key/rsakey.jks
    key-store-password: 123456
    key-store-type: JKS
    key-alias: tomcatjks
    urls: /*
  port: 8443
  non-ssl-port: 8080


1.Http请求工具类
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.json.JSONObject;

public class HttpsGetData {
    private static class TrustAnyTrustManager implements X509TrustManager {
        
        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }
 
        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }
 
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[] {};
        }
    }
 
    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
    
    /**
     * 返回的结果是字符串格式
     * url:请求url
     * hearderKey:请求消息头ke值
     * headerValue:请求消息头key对应的value值
     * requestMethod:请求方式
     * param:json请求参数 
     */
    public String Do(String url,String hearderKey,String headerValue,String requestMethod,String param) throws Exception
    {
         String result = "";
         BufferedReader in = null;
            try {
                System.out.println("请求的URL为:"+url);
                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },new java.security.SecureRandom());
                URL realUrl = new URL(url);
                // 打开URL连接
                HttpsURLConnection connection = (HttpsURLConnection) realUrl.openConnection();
                // 设置https相关属性
                connection.setSSLSocketFactory(sc.getSocketFactory());
                connection.setHostnameVerifier(new TrustAnyHostnameVerifier());
                connection.setDoOutput(true);
                connection.setDoInput(true);
                // 设置通用的请求属性
                connection.setRequestProperty("Content-Type", " application/json");
                connection.setRequestProperty("Connection", "keep-alive");
                connection.setRequestProperty(hearderKey, headerValue);//基于base基本认证							
                connection.setRequestMethod(requestMethod);
                // 建立实际的连接
                connection.connect();
                // 添加请求参数
                if(StringUtil.isNotEmpty(param)){
                	OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());  
                    writer.write(param);
                    writer.flush(); 
                }
                
                // 读取URL的响应结果
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
                System.out.println("获取的结果为:"+result);
            } catch (Exception e) {
                System.out.println("发送请求出现异常!" + e);
                throw e;
            }
            // 使用finally块来关闭输入流
            finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (Exception e2) {
                    //e2.printStackTrace();
                    throw e2;
                }
            }
            return result;
    
    } 
    
}


2.接口服务编写
@SuppressWarnings("unchecked")
	@RequestMapping(value="/getCatHosOrg",method=RequestMethod.POST)
	@ApiOperation(value="xxxxxx查询")
	public ResponseData<CatHosOrgEntity> getCatHosOrg(@RequestBody(required=false) CatHosOrgEntity catHosOrgEntity,
														@RequestParam(defaultValue="1",required=false) int page,
														@RequestParam(defaultValue="15",required=false) int size,
														ComebakColumn comBak){
		QueryParams<xxxx> params = new QueryParams<xxxxx>();
		Page pageSize = new Page();
		pageSize.setPages(page);
		pageSize.setPageSize(size);
		params.setPaging(pageSize);
		params.setEntity(catHosOrgEntity);
		try {
			List<xxxx> catHosOrgList = this.catHosOrgService.queryEntityPage(params);
			jsonObjects = new ArrayList<JSONObject>();
			if(comBak.getList() != null && comBak.getList().size() >0){
				for(CatHosOrgEntity catHosOrgEntitys:catHosOrgList){
					jsonObject = new JSONObject();
					for(Field field:catHosOrgEntitys.getClass().getDeclaredFields()){
						for(String list:comBak.getList()){
							if(field.getName().equals(list)){
								Method method = CatHosOrgEntity.class.getMethod("get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1));
								jsonObject.put(field.getName(),(Object)method.invoke(catHosOrgEntitys));
							}
							
						}
					}
					jsonObjects.add(jsonObject);
				}
				return success(jsonObjects);
			}else {
				return success(catHosOrgList);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			return error("xxx查询");
		}
		
	}


3.拦截器定义
/**
 * 对请求用户进行拦截
 * @author 
 */
public class MvcInteractor implements HandlerInterceptor{
	
	protected Logger log = LoggerFactory.getLogger(MvcInteractor.class);
	
	@SuppressWarnings("all")
	@Override
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
		boolean flag = false;
		String token = request.getHeader("Authorization").substring(7);
		@SuppressWarnings("restriction")
		BASE64Encoder encoder = new BASE64Encoder();
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		PrintWriter out = null;
		JSONObject res = new JSONObject();
		ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
		JdbcTemplate jt = (JdbcTemplate) ac.getBean("jdbcTemplate");
		AppInfoRepository ap = (AppInfoRepository) ac.getBean("appInfoRepository");
		//获取用户信息
		try {
			AppInfo appInfo = ap.findByAppId(request.getParameter("account").toString());
			log.info("认证地址:"+request.getServerName());
			log.info("认证端口:"+request.getServerPort());
			// token验证地址
			String tokenUrl = "https://"+request.getServerName()+":"+request.getServerPort()+"/oauth/token";
			HttpsGetData httpsGetData = new HttpsGetData();
			String tokenResult = httpsGetData.Do(tokenUrl+"?grant_type=client_credentials&scope","Authorization","Basic "+encoder.encode((appInfo.getAppId()+":"+appInfo.getAppKey()).getBytes()),"POST",null);
			// 转成json数据
			JSONObject tokenJSon = new JSONObject(tokenResult);
			if(!tokenJSon.getString("access_token").equals(token)){
				res.put("code", "202");
				res.put("msg", "该账号无权限访问,请联系管理员!token不匹配!");
				out = response.getWriter();
				out.append(res.toString());
				return flag;
			}
			// 判断该APP_ID下面的角色是否有权访问该URL
			StringBuilder sql = new StringBuilder(500);
			sql.append("SELECT A.INTERFACE_URL FROM APP_INTERFACE A LEFT JOIN ROLES_URL R ON A.ID = R.APP_INTERFACE_ID LEFT JOIN ROLES S ON R.ROLE_ID = S.ID WHERE S.ID IN (");
			sql.append("SELECT B.ID FROM APP_ROLES A JOIN ROLES B ON A.ROLE = B.ID WHERE A.APP_ID = ? )") ;
			List<String> urlList = jt.query(sql.toString(),new Object[]{appInfo.getAppId()}, new RowMapper<String>() {
	            @Override
	            public String mapRow(ResultSet resultSet, int i) throws SQLException {
	                return resultSet.getString("interface_url");
	            }
	        });
			for(String url:urlList){
				if(request.getRequestURL().indexOf(url) > -1){
					return true ;
				}
			}
			if(!flag){
				res.put("code", "202");
				res.put("msg", "该账号无权限访问,请联系管理员!");
				out = response.getWriter();
				out.append(res.toString());
			}
		} catch (Exception e) {
			e.getCause();
			log.error("该账号无权限访问,请联系管理员!");
		}	
		return flag;
	}

	@Override
	public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request,HttpServletResponse response,
						 Object handler, Exception ex)throws Exception {
	}
}


4.测试代码
public static void main(String[] args) throws Exception {
		//String clientReq = "appId:appKey";//默认客户端ID和客户端秘钥
		String client_id="appId";//默认客户端ID
		String client_secret = "appKey";//默认客户端秘钥
		BASE64Encoder encoder = new BASE64Encoder();
		BASE64Decoder decoder = new BASE64Decoder();
		//String tokenUrl = "https://101.37.25.220:8091/oauth/token?grant_type=client_credentials&scope";
		String tokenUrl = "https://localhost:8443/oauth/token";
		HttpsGetData httpsGetData = new HttpsGetData();
		List<String> list = new ArrayList<String>();
		/**
		 * 获取返回的token
		 * 注:请求头为Authorization,值为Basic加空格加client_id:client_secret的Base64编码
		 */
		String tokenResult = httpsGetData.Do(tokenUrl+"?grant_type=client_credentials&scope","Authorization","Basic "+encoder.encode((client_id+":"+client_secret).getBytes()),"POST",null);
		JSONObject tokenJSon = new JSONObject(tokenResult);//转成json数据
		String token = tokenJSon.getString("access_token");
		/**
		 * 请求参数为json格式
		 */
		JSONObject paramJson = new JSONObject();
		paramJson.put("modifyDate", "2017-10-30");
//		paramJson.put("facNameF","江西");
//		paramJson.put("convertF","盒");		
//		paramJson.put("nameCn", "片");
//		paramJson.put("smlNameF", "片");
//		paramJson.put("normF", "2G");
		/**
		 * 返回字段为字符串的list集合
		 */
		list.add("facNameF");
		list.add("convertF");
		list.add("nameCn");
		list.add("smlNameF");
		list.add("normF");
		String params = (StringUtils.strip(list.toString(), "[]").replaceAll(" ", ""));//删除集合中的空格
		/**
		 * 分页
		 * 默认:page="1";size="15"
		 * 注:请求头为Authorization,值为Bearer加空格加token
		 */
		String page = "1";
		String size = "10";
//		String resultUrl = "https://localhost:8443/api/v1.0/catZxmedProduct/getCatZxmedProduct?page="+page+"&size="+size+"&list="+params+"&account="+client_id;
		String resultUrl = "https://localhost:8443/api/v1.0/catZxmedProduct/getCatZxmedProductByDate?page="+page+"&size="+size+"&list="+params+"&account="+client_id;
		//String resultUrl = "https://localhost:8443/api/v1.0/demo/HXUDP0000000000000000000000034?account="+client_id;
		//注:若无json请求参数,则paramJson = null;
		httpsGetData.Do(resultUrl,"Authorization","Bearer "+token,"POST",paramJson.toString());//请求获取数据
	}



分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    概率论与数理统计试卷三套(含答案)

    2020-2021年概率论与数理统计试卷

    “人力资源+大数据+薪酬报告+涨薪调薪”

    人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。

    伊坂幸太郎21册合集.mobi

    伊坂幸太郎21册合集.mobi

    dsdy-b4-v30003-1h.apk

    dsdy-b4-v30003-1h.apk

    Python实现基于Socket通信+PyQt5的仿QQ聊天系统项目源码(高分项目)

    Python实现基于Socket通信+PyQt5的仿QQ聊天系统项目源码(高分项目)开发软件: Pycharm+ Python3.6数据库:mysql8.0 本软件基于python gui图形库pyqt5编写的仿qq,采用mysql数据库存储,socket通信(tcp协议)实现,支持多账号登录,注册,单人私聊,群聊,添加好友分组等功能。 Python实现基于Socket通信+PyQt5的仿QQ聊天系统项目源码(高分项目)客户端界面目录文件:pyqt5-qq,服务端目录文件:Tcpserver Python实现基于Socket通信+PyQt5的仿QQ聊天系统项目源码(高分项目)服务端目录结构: common:存放公共的工具类代码文件目录,主要是配置文件解析工具类,数据库操作工具类,本软件主要使用的是sqlalchemy orm数据库框架。 configfile:存放配置文件目录 dto:存放数据库表模型类代码文件 Python实现基于Socket通信+PyQt5的仿QQ聊天系统项目源码(高分项目)客户端目录结构: image,res:存放资源文件,其他文件:界面及逻辑实现源码

    学期期末考试试卷模板含有装订虚线.doc

    学期期末考试试卷模板含有装订虚线.doc

    植物大战僵尸(杂交版可用)修改器.zip

    植物大战僵尸杂交版 仅供学习交流使用 使用QT编写,代码简单易懂,直接编译运行即可,或者直接下载release中的release.zip,运行其中的pvz_cheating.exe 目前支持功能: 修改阳光 定时修改阳光 无冷却 金币修改(地址好像不适用,需要重新定位寻址) 基本不会更新,有问题可以提issue,欢迎pr

    模拟退火算法求解旅行商问题-TSP最短路问题-Python代码

    模拟退火算法(Simulated Annealing,SA)加入了Metropolis函数,该函数值决定了算法接受一个更劣解的概率,这个机制能帮助算法跳出局部最优。 本案例中以31个节点的测试数据做演示,基于简单的邻域搜索策略实现模拟退火,并将最终结果画图展示,本案例非常适合初学者学习,欢迎下载

    课程设计基于python+mediapipe+opencv开发的手势识别系统源码(含超详细注释) .zip

    课程设计基于python+mediapipe+opencv开发的手势识别系统源码(含超详细注释) .zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 课程设计基于python+mediapipe+opencv开发的手势识别系统源码(含超详细注释) .zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 课程设计基于python+mediapipe+opencv开发的手势识别系统源码(含超详细注释) .zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。设计基于python+mediapipe+opencv开发的手势识别系统源码(含超详细注释) .zip本资源中的源码都是经过本地编译过可运行的,评审分。。

    A025---个人主页17.zip

    A025---个人主页17.zip

    2024-2030中国USB插座充电器市场现状研究分析与发展前景预测报告 Sample.pdf

    QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。 邮箱:market@qyresearch.com

    医药继续教育项目完成情况报告表.doc

    医药继续教育项目完成情况报告表.doc

    NX二次开发uf5327 函数介绍

    NX二次开发uf5327 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,还是希望提高工作效率的普通用户,NX 二次开发 Ufun 都可以帮助您实现更高效的工作流程。函数覆盖了 NX 软件的各个方面,包括但不限于建模、装配、制图、编程、仿真等。这些 API 函数可以帮助用户轻松地实现自动化、定制化和扩展 NX 软件的功能。例如,用户可以通过 Ufun 编写脚本,自动化完成重复性的设计任务,提高设计效率;或者开发定制化的功能,满足特定的业务需求。语法简单易懂,易于学习和使用。用户可以快速上手并开发出符合自己需求的 NX 功能。本资源内容 提供了丰富的中英文帮助文档,可以帮助用户快速了解和使用 Ufun 的功能。用户可以通过资源中的提示,学习如何使用 Ufun 的 API 函数,以及如何实现特定的功能。

    计算机视觉与图像处理pdf

    什么是计算机视觉:使计算机具有像人那样的视觉功能--“计算机视觉的挑战是要为计算机和机器人开发具有与人类水平相当的视觉能力。机器视觉需要图像信号,纹理和颜色建模,几何处理和推理,以及物体建模。一个有能力的视觉系统应该把所有这些处理都紧密地集成在一起。源于图像处理与模式识别是人工智能的一个分支困难和研究意义

    NX二次开发uf5368 函数介绍

    NX二次开发uf5368 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,还是希望提高工作效率的普通用户,NX 二次开发 Ufun 都可以帮助您实现更高效的工作流程。函数覆盖了 NX 软件的各个方面,包括但不限于建模、装配、制图、编程、仿真等。这些 API 函数可以帮助用户轻松地实现自动化、定制化和扩展 NX 软件的功能。例如,用户可以通过 Ufun 编写脚本,自动化完成重复性的设计任务,提高设计效率;或者开发定制化的功能,满足特定的业务需求。语法简单易懂,易于学习和使用。用户可以快速上手并开发出符合自己需求的 NX 功能。本资源内容 提供了丰富的中英文帮助文档,可以帮助用户快速了解和使用 Ufun 的功能。用户可以通过资源中的提示,学习如何使用 Ufun 的 API 函数,以及如何实现特定的功能。

    水性环氧涂料,全球前10强生产商排名及市场份额调研数据(by QYResearch).pdf

    QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。 邮箱:market@qyresearch.com

    高等职业教育品牌专业申报表.doc

    高等职业教育品牌专业申报表.doc

    hbase-1.4.4-bin.tar.gz

    hbase-1.4.4-bin.tar.gz 是 Apache HBase 1.4.4 版本的二进制发行包。Apache HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,它运行在 Hadoop Distributed FileSystem (HDFS) 上,提供了大数据的随机实时读写访问能力。 HBase 需要运行在 Hadoop 集群上,因此你需要先安装和配置 Hadoop。 HBase 1.4.4 通常与 Hadoop 2.x 版本兼容,但具体兼容性可能因 Hadoop 的子项目版本和特定配置而异。 你可能还需要安装 Java Development Kit (JDK) 1.8 或更高版本,因为 HBase 是用 Java 编写的。

    一看就会的思维导图-C++手动模拟String的增删查改

    一看就会的思维导图-C++手动模拟String的增删查改

    插入排序-18-右连接查询.ev4.rar

    插入排序-18-右连接查询.ev4.rar

Global site tag (gtag.js) - Google Analytics