api接口设计

api接口设计

健壮性

  1. 对外提供的接口,最好支持幂等性,即相同的请求重复调用,服务端的操作应该只有一次,并且每次返回的结果应该是一样的。
    一般的做法是要求客户端在每次调用的时候带上唯一键,服务端第一次正常处理,并缓存唯一键和结果,后面再有重复调用,即可直接获取缓存结果返回。
    如果客户端没有唯一键的条件,也可以要求传时间戳,用时间戳作为唯一键。
  2. 对外的接口,粒度能细就细,最好不要是那种入参是type,然后服务端根据type类型返回不同的数据,这样容易被调用方猜到一些服务端不想暴漏的内容。
    举个例子,比如你要对外提供字典接口。 你的service方法是入参type, type=country,就返回所有国家字典;
    type=currency,就返回所有币种字典。
    其实你只想对外暴漏这两个功能,但其实你的service还支持type=company,就返回所有公司,
    这个你是不想对外暴漏的,但有可能会被调用方猜到,从而获取了隐私数据。
    所以这种情况,就应该把接口拆开,比如获取国家就是一个接口,获取币种就是另外一个接口。
  3. 接口的入参,最好是包好的dto,这个不用多说,接口升级的时候,不会影响到用旧版本的客户端,便于扩展。
  4. 接口的出参,尽可能的少,没用的字段一定不要加,因为考虑到以后接口维护的时候,加字段好加,减字段可不好减。
  5. 接口的出参,服务不要把异常直接抛出来,一定要加全局异常捕获,明确指定不同类型的出参码,比如调用错误是什么,参数错误是什么等等。
  6. 单一职责,一个接口应该是专门给一个功能或者一类特定功能用的,避免接口复用,这个也是扩展性问题。
  7. 命名要统一,一定要有全局意识。比如所有的查询都是find开头,所有的查列表都是以list结尾,所有的分页都是currentPage+pageSize等等
  8. 命名要准确,随便用汉字拼音首字母命名都是一种不负责任的做法

安全性

  1. 上面有提到用时间戳作为请求唯一键,可以做幂等。其实用时间戳,还有个好处,就是可以判断是不是截取url的恶意调用。
    因为我们可以判断当前时间和时间戳的间隔,如果大于某个值,比如大于5秒,我们就判定这个url无效。 这样可以有效的抵挡一部分的DOS攻击。
  2. 如果调用方很确定,并且数量不多的话,直接配置ip白名单,简单高效。
  3. 再复杂的设计,比如签名验证,但个人觉得这个普通场景没什么必要,增加复杂度,
    但安全度极高的场景,是必加的,而且至少要token+时间戳的签名,token是客户端的身份证明。

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

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

相关文章

【转载】广告系统架构解密

广告、增值服务、佣金,是互联网企业最常见的三种盈利手段。在这3大经典中,又以广告所占的市场份额最大,几乎是绝大部分互联网平台最主要的营收途径,业务的重要性不言而喻。 从技术角度来说,广告业务涉及到 AI算法、大数…

【读书笔记】--- 《码出高效:java开发手册》

这几天读了几本书,突然觉得可以写点什么,因为我也看了不少书了,于是就有了个想法,我可以在我看过的每本书后,把我的一些想法记录下来,一方面可以供以后回忆,一方面可以让读者看到后,…

quartz 报错:Failure obtaining db row lock: Table ‘test.QRTZ_LOCKS‘ doesn‘t exist

问题: spring-boot 整合quartz的时候,连接windows的mysql的时候好好的,然而用linux上的mysql的时候,启动就报了这个错: Failure obtaining db row lock: Table ‘test.QRTZ_LOCKS’ doesn’t exist 分析&#xff1a…

quartz 本地有效,线上失效的问题

问题: 最近开了一个新项目,spring boot 整合了quartz,出现了一个问题,就是当项目连接到本地电脑的数据库时,一切正常。但是当项目连接远程linux上的数据库的时候,发现定时任务不灵了,也不是不执…

关于SimpleDateFormat线程不安全的源码分析

SimpleDateFormat,线程不安全,源码分析 1、先看SimpleDateFormat类图 SimpleDateFormat继承了DateFormat DateFormat中有个成员变量是Calendar,这个先记住,线程不安全主要就是因为这个成员变量 2、看下图SimpleDateFormat的p…

mysql 报错 Specified key was too long; max key length is 767 bytes,开启系统变量:innodb_large_prefix

mysql 报错 Specified key was too long; max key length is 767 bytes 当mysql数据库的字符集使用了utf8mb4,就很容易在执行建表sql的时候报这个错误。 原因: mysql有个系统变量innodb_large_prefix, 如果开启了,索引键前缀限…

mysql8.0 线上线下数据库版本不一致导致的问题

问题: 线上注册失败,线下测试环境没问题 update t_authentication_code set invalid 0,update_time sysdate() where email ‘XXX’ and code ‘XXX’ and invalid 1; 同样的sql,线下执行成功,线上却一直没有修改成功 分析…

vue 每次弹框都初始化

之前弹框都是下图这种: 通过detailOpen变量控制是否显示弹框 但这种最近在整合tinymce富文本编辑器的时候,发现第二次弹框数据没有回填 原因是因为第一次弹框关闭后,没有初始化,从而影响了后面的弹框功能。 修改成下图就好了&…

微信小程序支付流程(新手教程)

微信小程序支付流程: 一、前期申请准备工作 1、小程序注册,要以公司的以身份去注册一个小程序,才能开通微信支付权限; 个人申请的小程序是不具备“微信支付”功能的! 但个人小程序可以生成微信支付的那个收款二维码&…

mysql 报错解决思考Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column

mysql报错: [Err] 1055 - Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘库名.表名.字段’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_g…

报表设计调研分享

公司结算系统要做一个内部报表,想自己开发,调研了市面上一圈报表,快把github翻烂了,也没找到一个合适的。 之前给做过一个自定义sql查询的,但最终是因为系统太过复杂,导致最终sql复杂到没法写了&#xff0c…

java 调用groovy脚本,实现多个sql按指定逻辑运行,可做报表预聚合

java 调用groovy脚本&#xff0c;实现多个sql按指定逻辑运行&#xff0c;可做报表预聚合 1、引入pom <dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>2.1.6</version></dependenc…

互联网技术部门该如何管理

互联网技术部门该如何管理 一、敏捷开发 1.快速开发、快速迭代。 2.组件式开发&#xff0c;避免重复造轮子。 3.制定代码标准。 4.并行开发&#xff0c;高效配合。 5.单元测试必须覆盖所有核心业务。 二、DevOps流程建立起来 1.建立三套环境&#xff1a;测试、SandBox、…

分布式基础

四大基础理论 拜占庭将军问题 CAP 理论 为什么CAP不能同时满足的简单理解 ACID 理论 BASE 理论 八大分布式协议和算法 Paxos 算法 Raft 算法 [分布式一致性协议] ------ raft协议的解释与理解 一致性 Hash 算法 hash和一致性hash Gossip 协议算法 Quorum NWR 算法…

java file.renameTo返回false的原因记录

需要对文件夹下的文件重命名&#xff0c;发现返回false了&#xff0c;先用main方法测试&#xff0c;发现没问题&#xff0c;如下 public static void main(String[] args) throws IOException {File file1 new File("D:\\aabb.xml");File file2 new File("D:\…

若依前后分离项目,发布在阿里云效中

后端服务 配置代码源 配置构建信息 mvn -B clean package -pl ruoyi-admin -am -Dmaven.test.skip=true -Dautoconfig.skip 项目名称和pom文件中保持一致,都叫ruoyi-admin

mysql 使用id in(‘1,2‘) 的时候,只能查到id=1的数据的解决方法

mysql 使用id in(‘1,2’) 的时候&#xff0c;只能查到id1的数据的解决方法 前提&#xff1a; t_user表有两条数据&#xff0c;id分别是1和2 场景1 查询&#xff1a;select * from t_user where id in(1,2) 结果&#xff1a;两条数据 正常 场景2 查询&#xff1a;select …

JVM基础知识汇总

1.jvm是什么 Java Virtual Machine&#xff08;Java虚拟机&#xff09;,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 本文jvm是基于jdk7写的,关于jdk8的jvm,和jdk7的稍有不同,详见文章末尾链接 2.jvm能做什么 java语言之所以可以跨平台,就…

java程序员常用查询和学习的网站

常用的一些程序员相关网站,在这里记录下,大家一起学习 置顶&#xff1a; 唯品会java开发手册&#xff08;基于阿里巴巴java开发手册&#xff09; pdf转word&#xff08;推荐用这个&#xff0c;国外的&#xff09; pdf转word&#xff08;国内的这个有大小限制&#xff09; 1.生成…

Longest Palindromic Substring Part II

Longest Palindromic Substring Part II 给定一个字符串 S, 找出字符串S中的最长回文子字符串. 注意: 这是关于:Longest Palindromic Substring.的第二篇文章了.在这里,我们讨论一种可以再线性时间内找到字符串中最长回文子字符串的一种算法(Manacher’s algorithm).请先阅读第…