0226 rest接口设计

线上事故
• 阅读 2116

           0226 rest接口设计

背景

为了更方便的书写和阐述问题,文章中按照第一人称的角度书写。作为一个以java为主要开发语言的工程师,我所描述的都是java相关的编码和设计。

工程师的静态输出就是代码和文档,动态的就是各种应用程序(app,h5站点,微信公众号,小程序)。动态的先不讨论,主要讨论静态的。
随意查看一个代码库,可以看到代码的编写过程,某些代码可能在现在看来实现很低效和可笑,但是在当时的技术和时间场景下,肯定是最优的输出。
也可以在gitlab上看看每次的pull request ,看看当时对这些代码的codeReview ;
反馈出的问题就是程序的设计非常重要。而接口是功能的抽象,相对比较稳定,对团队来说影响比较大。

**

API设计原则


先给接口来个简单的定义:即协议,约定了请求和响应的参数和格式。

接口设计要求是:
1.简洁;
2.考虑到向后兼容;

业界有一些基本的原则:

1 restfull

restfull是一种设计风格,一切接口皆是资源。


目前是设计的主流,思想也非常先进。

2 参数结构化

请求和响应中的参数要结构化,好处是易读易用。

3 安全


这个怎么重要都不为过,接口设计必须考虑认证和授权,保证特定的人只能访问特定的资源。


同时需要注意在日志中不能含有用户和系统的敏感信息。

4 客户端无关

也就是接口要通用,可以处理不同客户端的请求。一般在接口设计的时候,可以带入透传参数,比如时区,位置(省市区),系统类型,系统版本,应用类型,应用版本等;

5 幂等

即接口的第一次请求的结果和后面N次的重试结果要不变,需要结合场景来保证。

API设计实践


接口框架选型

有了接口设计的原则,可以挑选一个可靠的接口框架来支持自己的工作,

一个好的接口框架应该有如下特点:

  1. 对访问控制的支持;
  2. 自动测试的支持;
  3. 请求响应格式和序列化的支持;
  4. 日志和日志过滤的支持;
  5. 自动生成文档的支持;
  6. 对架构和性能的影响较小;

我一般选的springmvc,因为平时工作跟spring贴合的比较紧,而且spring有各种生态,适合在不同的行业和公司使用。jersey也用,虽然灵活,但是不具备普遍适用性;

设计中的平衡

1 设定团队的API设计和实现模式

api太自由,会影响团队的协作,而共同约定api的设计模式和实现模式可以解决这个问题。

2 避免过度设计

要综合考虑向后的兼容性,但是只实现当前软件当前阶段必须的功能点。

3 谨慎使用AOP

面向切面编程可以在跟业务无关的垂直领域处理问题,比如日志,监控,解析等;可以提高代码的重用性和规范性;

但是也有缺点,比如,增加了测试和分析的难度,也对研发人员要求比较高。

所以需要综合考虑。

4 可维护性和性能之间要平衡

接口实现进行封装可以提高可维护性,但是也会带来性能开销,所以也是需要综合考虑的。

**

小结


通过本篇文章你可以学到如下内容:

  • [ ] 接口设计的原则
  • [ ] 接口设计框架选型要点
  • [ ] 接口设计过程中的设计实践问题

设计良好的接口,可以提高软件的复用性,提高团队的输出效率和质量。

0226 rest接口设计

原创不易,转载请注明出处,欢迎沟通交流。
点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
九路 九路
4年前
一个爬虫的故事:这是人干的事儿?
本文转载自轩辕之风的文章,链接https://mp.weixin.qq.com/s/YygbUWpa2mbPZPuPNhdt2w爬虫原理我是一个爬虫,每天穿行于互联网之上,爬取我需要的一切。image.png(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/656d
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
CRM从哪些方面进行了管理?
我们将CRM(https://www.sap.cn/products/crm.html!image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/17e2d96568a98f0
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
线上事故
线上事故
Lv1
六翮飘飖私自怜,一离京洛十馀年。
文章
3
粉丝
0
获赞
0