当前位置: 首页 > news >正文

工作实战之系统交互api调用认证设计

目录

前言

一、黄金段位接口交互

二、钻石段位接口交互设计

1.接口文档定义

2.工具类以及demo提供

a.调用方部分代码

b.被调用方

三.星耀段位接口访问设计

1.在钻石段位的基础上,进行sdk的封装

  a.maven引入

   b.sdk包含工具类

四.王者段位接口访问设计 

1.开发详情

2.项目结构

3.系统侧使用

 4.源码下载

总结


前言

在系统开发过程中,系统与系统之间往往不是完全独立的,需要进行互相调用

黄金段位:直接http访问api接口,获取相关数据

钻石段位:定义接口规范,发放授权,api接口需要认证授权才能访问

星耀段位:提供sdk客户端,封装调用api接口所需要的加解密以及http访问的工具类

王者段位:sdk进一步封装,封装成近似本地调用的api接口,调用方只需配置appId,appSecret,接口域名即可,采用springboot自动装配,开发自己的starter


一、黄金段位接口交互

 public String doPost(String host, String uri, String body, String method) {try {String address = host + uri;URL restServiceURL = new URL(address);HttpURLConnection httpConnection = (HttpURLConnection) restServiceURL.openConnection();httpConnection.setRequestMethod(method);httpConnection.setDoOutput(true);httpConnection.setDoInput(true);httpConnection.setRequestProperty("Content-Type", "application/json");OutputStream outputStream = httpConnection.getOutputStream();outputStream.write(body.getBytes(StandardCharsets.UTF_8));outputStream.flush();if (httpConnection.getResponseCode() != 200) {throw new RuntimeException("Failed : HTTP outor code : " + httpConnection.getResponseCode());}BufferedReader responseBuffer = new BufferedReader(new InputStreamReader(httpConnection.getInputStream(), "UTF-8"));StringBuilder output = new StringBuilder();do {output.append(responseBuffer.readLine());} while (responseBuffer.read() != -1);httpConnection.disconnect();return output.toString();} catch (Exception e) {LOGGER.error("请求post接口报错:{}", e);}return null;}

二、钻石段位接口交互设计

1.接口文档定义

账号:appId; 授权密钥:appSecret;http每次请求header中需要添加appId、randomcode、timestamp、encodekey、sign五个参数,接口将使用这五个参数进行鉴权判断请求方式是否可以使用当前API

序号

参数名

参数类型

描述

值(样例)

1

appId

String必填

授权帐号

liangxi.zeng

2

randomcode

String必填

随机生成的字符串(每次可不相同)

2sd4TeSk

3

timestamp

String必填

当前时间戳

20150917160500

4

encodekey

String必填

前三个参数拼在一起后加上SIM授权的密钥appSecret作为salt使用SHA-256算法进行加密

8729e01cb547sdc3ea645aaa9f8493ab251e5ef32c3d6628cf85f985319145e3

5

sign

String必填

签名信息,采用MD5加密,计算公式接口:sign=MD5(uri&body&appSecret),有些接口可能没有body,参数是在URL中,则将body置为空串进行签名

6

appSecretString必填

加解密双方约定自定义的字符串,用作加密,不能直接放入header

o10ympt70x8gqas8hpoctopk3lwrdfd

7Content-TypeString必填参数提交方式application/Json

 

2.工具类以及demo提供

a.调用方部分代码

加解密工具类DigestUtilspublicvoid setHeader(HttpURLConnection httpConnection,String uri,String body,String method) throws ProtocolException {httpConnection.setRequestMethod(method);httpConnection.setDoOutput(true);httpConnection.setDoInput(true);httpConnection.setRequestProperty("Content-Type", "application/json");httpConnection.setRequestProperty("appId", appId);String randomCode = RandomStringUtils.random(16, true, true);httpConnection.setRequestProperty("randomcode", randomCode);String dateNow = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss");httpConnection.setRequestProperty("timestamp", dateNow);//加密String encodeKey = DigestUtils.sha256Hex(StringUtils.join(appUser, randomCode, dateNow, "{", privateKey, "}"));httpConnection.setRequestProperty("encodekey", encodeKey);//签名String sign = DigestUtils.md5Hex(StringUtils.join(uri, "&", body, "&", privateKey));httpConnection.setRequestProperty("sign", sign.toUpperCase(Locale.ROOT));}public String doPost(String host, String uri, String body, String method) {try {String address = host + uri;URL restServiceURL = new URL(address);HttpURLConnection httpConnection = (HttpURLConnection) restServiceURL.openConnection();//设置加解密参数认证参数setHeader(httpConnection,url,body,method);OutputStream outputStream = httpConnection.getOutputStream();outputStream.write(body.getBytes(StandardCharsets.UTF_8));outputStream.flush();if (httpConnection.getResponseCode() != 200) {throw new RuntimeException("Failed : HTTP outor code : " + httpConnection.getResponseCode());}BufferedReader responseBuffer = new BufferedReader(new InputStreamReader(httpConnection.getInputStream(), "UTF-8"));StringBuilder output = new StringBuilder();do {output.append(responseBuffer.readLine());} while (responseBuffer.read() != -1);httpConnection.disconnect();return output.toString();} catch (Exception e) {LOGGER.error("请求post接口报错:{}", e);}return null;}

b.被调用方

对请求头里传入的参数进行一一校验即可,设计成过滤器拦截,提供给外部的接口都需要认证鉴权

三.星耀段位接口访问设计

1.在钻石段位的基础上,进行sdk的封装

     a.maven引入

<dependency><groupId>com.tcl.api.auth</groupId><artifactId>auth-util</artifactId><version>2.2.0-RELEASE<</version>
</dependency>

   b.sdk包含工具类


/*** api 访问工具类* @author liangxi.zeng*/
@Slf4j
public class ApiHttpUtils {/*** 设置请求同* @param httpConnection* @param uri* @param appId* @param body* @param method* @throws ProtocolException*/private static void setRequestHeader(HttpURLConnection httpConnection, String uri,String appId,String appSecret, String body, String method) throws ProtocolException {httpConnection.setRequestMethod(method);httpConnection.setDoOutput(true);httpConnection.setDoInput(true);httpConnection.setRequestProperty("Content-Type", "application/json");httpConnection.setRequestProperty("appuser", appId);String randomCode = RandomStringUtils.random(16, true, true);httpConnection.setRequestProperty("randomcode", randomCode);log.debug("randomcode:{}", randomCode);String dateNow = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss'Z'");log.debug("dateNow:{}", dateNow);httpConnection.setRequestProperty("timestamp", dateNow);//加密String encodeKey = DigestUtils.sha256Hex(StringUtils.join(appId, randomCode, dateNow, "{", appSecret, "}"));log.debug("encodeKey:{}", encodeKey);httpConnection.setRequestProperty("encodekey", encodeKey);//签名String sign = DigestUtils.md5Hex(StringUtils.join(uri, "&", body, "&", appSecret));log.debug("sign:{}", sign);httpConnection.setRequestProperty("sign", sign.toUpperCase(Locale.ROOT));}/*** 发送post请求* @param host* @param uri* @param body* @return*/public static String doPost(String host, String uri, String body,String appId,String appSecret) {try {String address = host + uri;log.debug("appuser:{},privateket:{},address:{}", appId, appSecret,address);URL restServiceURL = new URL(address);HttpURLConnection httpConnection = (HttpURLConnection) restServiceURL.openConnection();setRequestHeader(httpConnection,uri,body,appId,appSecret,"POST");return getResponse(httpConnection,body);} catch (Exception e) {log.error("请求idm post接口报错:{}", e);}return null;}/*** 发送post请求* @param host* @param uri* @param body* @return*/public static String doGet(String host, String uri, String body,String appId,String appSecret) {try {String address = host + uri;log.debug("appuser:{},privateket:{},address:{}", appId, appSecret,address);URL restServiceURL = new URL(address);HttpURLConnection httpConnection = (HttpURLConnection) restServiceURL.openConnection();setRequestHeader(httpConnection,uri,body,appId,appSecret,"GET");return getResponse(httpConnection,body);} catch (Exception e) {log.error("请求idm post接口报错:{}", e);}return null;}/*** 获取响应内容* @param httpConnection* @param body* @return* @throws IOException*/private static String getResponse(HttpURLConnection httpConnection,String body) throws IOException {OutputStream outputStream = httpConnection.getOutputStream();outputStream.write(body.getBytes(StandardCharsets.UTF_8));outputStream.flush();if (httpConnection.getResponseCode() != 200) {throw new RuntimeException("Failed : HTTP outor code : " + httpConnection.getResponseCode());}BufferedReader responseBuffer = new BufferedReader(new InputStreamReader(httpConnection.getInputStream(), "UTF-8"));StringBuilder output = new StringBuilder();do {output.append(responseBuffer.readLine());} while (responseBuffer.read() != -1);httpConnection.disconnect();return output.toString();}}

四.王者段位接口访问设计 

1.开发详情

a.基于springboot的spring.factories开发自己的starter

b.采用openFeign实现http远程接口访问

c.用FeignRequestInterceptor完成请求头的权限认证参数放入

2.项目结构

3.系统侧使用

api:auth:appId: 12323appSecret: lakdsjlajdsljajskdjfdomain: https://sp.tcl.com/portal/
<dependency><groupId>com.tcl.ea.zenglx</groupId><artifactId>api-auth-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
@Service
public class RemoteDeal {@Autowiredprivate ApiClient apiClient;//获取用户信息public User getUserInfo() {return apiClient.getUserInfo();}}

 4.源码下载

api认证源码


总结

 1.发起http请求的开源框架有, Forest,httpClient,feign,OKHttp等

 2.开发组件需要了解spring的生命周期,各种特性,springboot的各种特性

相关文章:

工作实战之系统交互api调用认证设计

目录 前言 一、黄金段位接口交互 二、钻石段位接口交互设计 1.接口文档定义 2.工具类以及demo提供 a.调用方部分代码 b.被调用方 三.星耀段位接口访问设计 1.在钻石段位的基础上&#xff0c;进行sdk的封装 a.maven引入 b.sdk包含工具类 四.王者段位接口访问设计 1.开发详情 2.…...

学习系统编程No.5【虚拟地址空间】

引言: 北京时间&#xff1a;2023/2/22&#xff0c;离补考期末考试还有5天&#xff0c;不慌&#xff0c;刚午觉睡醒&#xff0c;闹钟2点20&#xff0c;拖到2点50&#xff0c;是近以来&#xff0c;唯一一次有一种睡不醒的感觉&#xff0c;但是现在却没有精神&#xff0c;因为听了…...

Linux常用指令(未完待续。。。)

* basename&#xff1a;只留下路径的“最后一部分” X、文件夹&目录操作 复制 &#xff1a;cp /xxx /xxx - a 该选项通常在拷贝目录时使用。它保留链接、文件属性&#xff0c;并递归地拷贝目录&#xff0c;其作用等于dpR选项的组合&#xff1b; - d 拷贝时保留链接&#…...

用D写裸机

原文 用D编写裸机RISC-V应用 这篇文章展示,如何用D编写,目标为RISC-VQEMU模拟器的程序裸机"你好".项目 为什么是D? 我最近一直在用C编写裸机代码,我有点对C缺乏特征感到沮丧.D引入了叫betterC的模式(基本上禁止了D运行时的所有语言功能).使得D裸机编程大致与C一…...

(二十五)、实现评论功能(5)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;实现二级回复的入库操作 1.1 两个子组件&#xff08;comment-item和comment-frame&#xff09;与父组件reply之间的属性传值 comment-item&#xff1a; props: {item: {type: Object,default () {return {}}}},comment-frame&#xff1a; props: {commentObj: {…...

【概念辨析】二维数组传参的几种可能性

一、二维数组传参竟然不是用二级指针进行接收&#xff1f; 今天进行再一次的二级指针学习时&#xff0c;发现了一条以前没怎么注意过的知识点&#xff1a;二维数组进行传参只能用二维数组&#xff08;不能省略列&#xff09;进行接收或者是数组指针。 问题复现代码如下&#xf…...

python和C++代码实现图片九宫格切图程序(附VS2015配置Opencv教程)

1、python代码实现图片分割成九宫格 需要包含的库&#xff0c;没有下载安装的&#xff0c;需要自己安装哦。 实现原理很简单&#xff0c;就是用PIL库不断画小区域&#xff0c;切下来存储成新的小图片。 假设每一个格子的宽和高分别是w、h&#xff0c;那么第row行&#xff08…...

【深度学习】优化器

1.什么是优化器 优化器是在深度学习的反向传播过程中&#xff0c;指引损失函数&#xff08;目标函数&#xff09;的各个参数往正确的方向更新合适的大小&#xff0c;使得更新后的各个参数让目标函数不断逼近全局最小点。 2.优化器 2-1 BGD 批量梯度下降法&#xff0c;是梯度下…...

SpringBoot使用validator进行参数校验

Validated、Valid和BindingResultBean Validation是Java定义的一套基于注解的数据校验规范&#xff0c;比如Null、NotNull、Pattern等&#xff0c;它们位于 javax.validation.constraints这个包下。hibernate validator是对这个规范的实现&#xff0c;并增加了一些其他校验注解…...

论文复现:风电、光伏与抽水蓄能电站互补调度运行(MATLAB-Yalmip全代码)

论文复现:风电、光伏与抽水蓄能电站互补调度运行(MATLAB-Yalmip全代码) 针对风电、光伏与抽水蓄能站互补运行的问题,已有大量通过启发式算法寻优的案例,但工程上更注重实用性和普适性。Yalmip工具箱则是一种基于MATLAB平台的优化软件工具箱,被广泛应用于工程界优化问题和…...

FastCGI sent in stderr: "PHP message: PHP Fatal error

服务器php7.2卸载安装7.4之后,打开网站一直无法访问,查看nginx错误日志发现一直报这个错误:2023/02/23 11:12:55 [error] 4735#0: *21 FastCGI sent in stderr: &#xff02;PHP message: PHP Fatal error: Uncaught ReflectionException: Class translator does not exist in …...

【数字IC基础】跨时钟域(CDC,Clock Domain Crossing)

文章目录 一、什么是跨时钟域?二、跨时钟域传输的问题?2、1 亚稳态(单bit:两级D触发器(双DFF))2、2 数据收敛(多bit亚稳态)(格雷码编码、握手协议、异步FIFO、DMUX)2、3 多路扇出:(先同步后扇出)2、4 数据丢失(延长输入数据信号):类似脉冲展宽2、5 异步复位(…...

UNI-APP学习

uni-app的基本使用 uni-app介绍 官方网页 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、H5、以及各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉&#xff09;等多个平台。 即使不跨端&#xf…...

编译原理【运行时环境】—什么是活动记录、 活动记录与汇编代码的关系

系列文章戳这里&#x1f447; 什么是上下文无关文法、最左推导和最右推导如何判断二义文法及消除文法二义性何时需要消除左递归什么是句柄、什么是自上而下、自下而上分析什么是LL(1)、LR(0)、LR(1)文法、LR分析表LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系编译原理第三章习…...

【Windows Server 2019】发布服务器 | 远程桌面服务的安装与配置 Ⅰ——理论,实验拓扑和安装基于RemoteAPP的RDS

目录1. 理论1.1 什么是远程桌面服务2. 实验拓扑2.1 拓扑说明3. 安装基于RemoteAPP的RDS1. 理论 1.1 什么是远程桌面服务 远程桌面服务 (RDS) 是一个卓越的平台&#xff0c;可以生成虚拟化解决方案来满足每个最终客户的需求&#xff0c;包括交付独立的虚拟化应用程序、提供安全…...

Bootstrap入门到精通(最全最详细)

文章目录前言一、Bootstrap是什么&#xff1f;二、Bootstrap安装方式一&#xff1a;将压缩包下载到本地引入使用方式二&#xff1a;使用Bootstrap官方cdn二.Bootstrap容器下面是屏幕宽度在不同大小时不同容器的显示状态三.Bootstrap栅格系统bootstrap网格系统有以下六个类网格系…...

C/C++每日一练(20230223)

目录 1. 数据合并 2. 回文链表 3. 完美矩形 1. 数据合并 题目描述 将两个从小到大排列的一维数组 (维长分别为 m,n , 其中 m,n≤100) 仍按从小到大的排列顺序合并到一个新的一维数组中&#xff0c;输出新的数组. 输入描述 第 1 行一个正整数 m , 表示第一个要合并的一维…...

c语言中const 是什么意思?(面试)

const关键字使用非常的灵活&#xff0c;在c中&#xff0c;const因位置不同有不同的作用&#xff0c;因情景不同有不同的角色&#xff0c;使用起来也是非常的灵活。 可以定义const常量&#xff0c;具有不可变性。 例如&#xff1a;const int Max100; Max会产生错误; 便于进行类…...

网络工程(三)ensp配置静态路由

配置静态路由 这里选择的路由器是AR2220 因为有三个GE接口 下面说拓扑图 一、定义AR路由ip地址和下一条 AR1system-viewsysname AR1interface g0/0/0ip address 10.0.0.254 8interface g0/0/1ip address 50.0.0.1 8下一条代码[AR1]ip route-static 0.0.0.0 0 50.0.0.2AR2 s…...

深入浅出C++ ——手撕红黑树

文章目录一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树的插入操作五、红黑树的验证五、红黑树的删除六、红黑树与AVL树的比较七、红黑树的应用八、红黑树模拟实现一、红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存…...

Cesium实战指南4-Polylines图元高级应用解析

1. Polylines图元基础概念与核心价值 在三维地理可视化领域&#xff0c;Polylines&#xff08;折线&#xff09;是最基础也最常用的图元之一。简单来说&#xff0c;它就是连接多个点的线段集合&#xff0c;但千万别小看这个基础功能——从飞机航线到河流走向&#xff0c;从城市…...

突破单机限制:PlugY重塑暗黑破坏神2游戏体验的五大维度升级

突破单机限制&#xff1a;PlugY重塑暗黑破坏神2游戏体验的五大维度升级 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 一、单机玩家的困境与破局之道 在暗黑破坏神…...

RePKG:5分钟掌握Wallpaper Engine资源提取与转换的终极指南

RePKG&#xff1a;5分钟掌握Wallpaper Engine资源提取与转换的终极指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专为Wallpaper Engine用户设计的开源工具&#x…...

Vant Weapp组件库无障碍颜色方案实践指南

Vant Weapp组件库无障碍颜色方案实践指南 【免费下载链接】vant-weapp 轻量、可靠的小程序 UI 组件库 项目地址: https://gitcode.com/gh_mirrors/va/vant-weapp 问题引入&#xff1a;被忽视的视觉障碍用户体验痛点 在小程序开发中&#xff0c;颜色设计往往聚焦于视觉美…...

Wan2.2-I2V-A14B实操手册:修改infer.py源码支持自定义帧率与编码参数

Wan2.2-I2V-A14B实操手册&#xff1a;修改infer.py源码支持自定义帧率与编码参数 1. 镜像基础与修改背景 Wan2.2-I2V-A14B私有部署镜像为文生视频任务提供了开箱即用的解决方案&#xff0c;但在实际业务场景中&#xff0c;我们经常需要对视频输出的帧率和编码参数进行精细控制…...

Cursor AI终极破解:免费解锁Pro功能的完整实战指南

Cursor AI终极破解&#xff1a;免费解锁Pro功能的完整实战指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial …...

用Python和Keras从零搭建一个BiLSTM入侵检测模型(基于NSL-KDD数据集)

用Python和Keras从零搭建BiLSTM入侵检测模型实战指南 在网络安全领域&#xff0c;入侵检测系统(IDS)正经历着从传统规则匹配到智能分析的范式转变。本文将带您使用Python生态中的Keras框架&#xff0c;基于经典的NSL-KDD数据集&#xff0c;构建一个具备实战价值的双向长短期记…...

重构数字桌面:2025年macOS菜单栏管理工具全解析

重构数字桌面&#xff1a;2025年macOS菜单栏管理工具全解析 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 问题溯源&#xff1a;为什么你的菜单栏变成了数字垃圾场&#xff1f; 当我们每天打开Mac…...

WindowResizer终极指南:三步解决Windows窗口无法调整大小的难题

WindowResizer终极指南&#xff1a;三步解决Windows窗口无法调整大小的难题 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 在日常使用Windows电脑时&#xff0c;你是否遇到过这样…...

CentOS 7 服务器环境部署 Pixel Dream Workshop:针对企业级生产的配置

CentOS 7 服务器环境部署 Pixel Dream Workshop&#xff1a;针对企业级生产的配置 1. 前言&#xff1a;为什么选择这个方案 如果你正在寻找一个稳定可靠的企业级AI图像生成解决方案&#xff0c;Pixel Dream Workshop在CentOS 7上的部署可能是你的理想选择。作为运维工程师&am…...