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

news2024/9/27 9:23:27

目录

前言

一、黄金段位接口交互

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

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.调用方部分代码

加解密工具类DigestUtils


   publicvoid 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: 12323
    appSecret: lakdsjlajdsljajskdjf
    domain: 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 {

    @Autowired
    private ApiClient apiClient;

    //获取用户信息
    
    public User getUserInfo() {
        
        return apiClient.getUserInfo();

    }

}

 4.源码下载

api认证源码


总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据技术为何诞生,它究竟解决了哪些问题?

大数据诞生背景与基本概念大数据为什么会诞生&#xff1f;以及它解决了哪些问题&#xff1f;1.大数据诞生之前的数据处理模式2.结构化数据在传统处理方式下的瓶颈3.非结构化与半结构化数据在传统处理方式下的瓶颈4.大数据诞生的初衷与定义大数据场景特征大数据为什么会诞生&…

day19_Set

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、Set 三、HashSet 四、LinkedHashSet 五、TreeSet 六、Collections 零、 复习昨日 提问过了… 一、作业 见代码… 二、Set Set集合是Collecti…

Mybatis源码笔记

String resource "mybatis-config.xml";Reader reader;try {//将XML配置文件构建为Configuration配置类reader Resources.getResourceAsReader(resource);// 通过加载配置文件流构建一个SqlSessionFactory DefaultSqlSessionFactorySqlSessionFactory sqlMapper …

多点电容触摸屏实验

目录 一、简介 二、硬件原理 ​编辑1、CT_INT 2、I2C2_SCL和I2C2_SDA 3、RESET复位引脚 三、FT54x6/FT52x6电容触摸芯片 四、代码编写 1、编写ft5426.h 2、编写ft5426.c 3、main函数 一、简介 电容屏只需要手指轻触即可&#xff0c;而电阻屏是需要手指给予一定的压力才…

Elasticsearch7.8.0版本进阶——动态更新索引

目录一、如何在保留不变性的前提下实现倒排索引的更新二、按段搜索执行流程三、按段搜索的文档查询四、按段搜索的文档删除五、按段搜索的文档更新一、如何在保留不变性的前提下实现倒排索引的更新 用更多的索引。通过增加新的补充索引来反映最近的修改&#xff0c;而不是直接…

【华为OD机试模拟题】用 C++ 实现 - 整理扑克牌(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

[Flink]部署模式(看pdf上的放上面)

运行一个wordcountval dataStream: DataStream[String] environment.socketTextStream("hadoop1", 7777) //流式数据不能进行groupBy,流式数据要来一条处理一次.0表示第一个元素,1表示第二个元素 //keyBy(0)根据第一个元素进行分组 val out: DataStream[(String, In…

Spring Boot中使用Sa-Token实现轻量级登录与鉴权

1. Sa-Token 介绍 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 功能结构图 2. 登录认证 对于一些登录之后才能访问的接口&#xff08;例如&…

Graph Embedding基础 图表示学习 什么是Graph Embedding

本文包括 DeepWalk LINE SDNE Node2vec Struc2vec等几个重要的Graph Embedding 方法 先说下不同embedding的区别是什么&#xff1a; DeepWalk&#xff1a;采用随机游走&#xff0c;形成序列&#xff0c;采用skip-gram方式生成节点embedding。node2vec&#xff1a;不同的随机游…

[游戏开发][Unity]Assetbundle打包篇(4)开始打包

上一篇文章讲了如何收集打包资源&#xff0c;得到了一个List<AssetInfo>下面正式进入打包流程&#xff0c;调用PostAssetBuild方法即可开始正式打包流程public void PostAssetBuild() {Debug.Log("------------------------------OnPostAssetBuild-----------------…

ASE140N04-ASEMI低压MOS管ASE140N04

编辑-Z ASE140N04在TO-220F封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为4mΩ&#xff0c;是一款N沟道低压MOS管。ASE140N04的最大脉冲正向电流ISM为400A&#xff0c;零栅极电压漏极电流(IDSS)为1uA&#xff0c;其工作时耐温度范围为-55~175摄氏度。ASE140N04…

深入浅出——this的理解与使用

文章目录 this的语法理解一、this的绑定方式二、两个细节 1.严格模式引入库2.如何更改this指向总结this的语法理解 this在英文中是一个指示代词&#xff0c;表示 这&#xff1b;这个 顾名思义&#xff0c;在编程于语言里&#xff0c;this就是一个指代作用。 我在人民广场吃…

《分布式技术原理与算法解析》学习笔记Day20

CAP理论 什么是CAP理论&#xff1f; CAP理论用来指导分布式系统设计&#xff0c;以保证系统的可用性、数据一致性等。 C&#xff0c;Consistency&#xff0c;一致性&#xff0c;指所有节点在同一时刻的数据是相同的&#xff0c;即更新操作执行结束并响应用户完成后&#xff…

GO 中的 defer 有哪些注意事项?上

xdm &#xff0c; 不知道你们是否有使用过 defer &#xff0c;这种语法在是 go 特有的&#xff0c;用起来真是爽的不要不要的 很多时候&#xff0c;我们在使用一些新东西&#xff0c;出现一些莫名其妙的现象或者是结果的时候&#xff0c;我们总会认为&#xff0c;这个东西不友…

打游戏什么蓝牙耳机好用?打游戏比较好的蓝牙耳机

游戏耳机提供身临其境的细致声音&#xff0c;同时也是与朋友在线聊天的绝佳通信设备&#xff0c;尤其对于游戏玩家来说&#xff0c;聆听和被聆听的最佳方式之一就是游戏耳机&#xff0c;那2023年到底有哪些值得购买的游戏耳机呢&#xff1f;现在就让我们一起来看看吧。 第一款…

【uniapp】uniapp项目vue2/vue3引入使用vant组件库

前言 vant是一个优秀的移动端组件库&#xff0c;他支持VUE2、VUE3、微信小程序三个框架&#xff0c;这期就来尝试在uniapp中&#xff0c;vue2和vue3分别引入vant组件库 注意&#xff1a;本教程只适用H5&#xff0c;无法运行到微信小程序 Vue3引入vant 新建一个uniapp项目&am…

如何利用 Python 进行客户分群分析(附源码)

每个电子商务数据分析师必须掌握的一项数据聚类技能 如果你是一名在电子商务公司工作的数据分析师&#xff0c;从客户数据中挖掘潜在价值&#xff0c;来提高客户留存率很可能就是你的工作任务之一。 然而&#xff0c;客户数据是巨大的&#xff0c;每个客户的行为都不一样。20…

python中安装gurobi和pycharm没有语法提示问题解决

安装gurobi第一步 &#xff1a;下载gurobi ( http://www.gurobi.com ) &#xff0c;需要注册账号第二步、申请License注册如果可以通过校园网&#xff0c; 则直接生成。不能的话&#xff0c;通过网站&#xff0c;发邮件申请 http://www.gurobi.cn/NewsView1.Asp?id4第三、邮件…

【虹科】基于Lidar的体积监控实现高效的库存管理

迄今为止&#xff0c;很多物料厂家测量库存的结果数据仍然不准确&#xff0c;会存在很大的误差&#xff0c;导致供应链效率低下——这个问题可以通过Lidar技术轻松解决。近年来&#xff0c;全球供应链的脆弱性已经多次得到证明。无论是油轮被困在苏伊士运河&#xff0c;阻塞海峡…

JSP 在线学习管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 在线学习管理系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为SQLServer2008&#x…