有没有想过?前后端分离实践中如何提升 API 开发效率 ?
Posted Java后端
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有想过?前后端分离实践中如何提升 API 开发效率 ?相关的知识,希望对你有一定的参考价值。
作者 | Jiadong
链接 | segmentfault.com/a/1190000010910896
团队内部RestAPI开发采用设计驱动开发的模式,即使用API设计文档解耦前端和后端的开发过程,双方只在联调与测试时耦合。在实际开发和与前端合作的过程中,受限于众多因素的影响,开发效率还有进一步提高的空间。本文的目的是优化工具链支持,减少一部分重复和枯燥的劳动。
现状梳理
前后端工作流
-
需求理解:前后端先理解产品思路、需求的详细内容 -
敲定接口:后端出API设计文档初稿,与前端面对面或者在线讨论修正,接着后端(有时是前端)把API描述记录到公司内部的API文档库(在线markdown编辑器,提供分级目录的存储功能,对如何描述API没有一定的标准,因此描述格式不统一,因人而异1)。接着根据双方工作的安排,约定联调时间 -
独立开发:双方独立开发(也有可能非完全独立开发,如需要对方的环境配合等;或者存在返工,如API设计发生变更等) -
系统联调:测试API基本功能和双方系统的连通性 -
测试回归:开发或者QA编写测试用例并测试业务流程
可优化方向
1. 减少文档编写时间
以开发“获得管理员账户下可用商户”为例。如果是简单的描述,后端告知前端url为{host}/ajax/shop,返回的结构是[{"shopId":int,"shopName":string}],有经验的前端会自动判断出Method为Get,Content-type为application/json,request不需要附带参数,不需要对错误值做特殊处理;而如果是复杂的描述,后端一般会列出API名称、功能描述、调用方式、请求参数、请求示例、返回值、成功的返回结果示例、失败的返回结果示例中的几项,填充到已有的API模板中②。
①以云打印机设置中的一个API为例,简单描述的典型。
-
设计文档中会规定API输出的数据结构(一般为json数组或者json对象),如果数据结构较为复杂(比如包含有几十个字段的POJO),要在设计文档中书写可读性良好的数据结构需要更多的时间;如果数据结构中字段缺失或者可读性差,则会影响前端的文档理解和代码开发。 -
如果后端能提供样例数据自然是最好的,因为后端最熟悉业务逻辑,产生的样例数据比前端自己Mock的数据更好。但是复杂数据结构的样例数据的编写同样很花时间。
举例:需求要求开发一个新增优惠券API,其样例数据只能由开发手动生成。如果是修改已有的API,要补充新的样例数据,开发一般会登录商户平台,打开优惠券页面,在Chrome中实际操作一遍,抓包得到request的body(json格式),在json格式化网站美化后复制到API设计文档中。
例如:想象一下从Wiki 文档的表格中一个个复制粘贴,再编辑成markdown格式文本是典型的成本大于收益的工作。
2. 减少联调时间
3. 减少部署时间
寻找技术候选
第一类:Swagger、Apiary、RAML
-
Design:其标准为OpenAPI(前身是Swagger API Spec),提供强大的在线编辑功能,包括语法高亮、错误提示、自动完成、 实时预览④ ,并且支持用户以Json、 Yaml格式撰写⑤ 、导入、导出、转换文档。 -
Build:设计文档可以编译成客户端和服务端,支持的语言包括Java、NodeJS、C++等主流语言。其中Java服务器端使用流行的Spring Boot构建,生成的代码包括定义的API接口、空实现方法的样板代码、业务POJO、配套的Swagger注解。值得注意的是,由自动生成的Swagger注解,可以反向生成最初的API设计文档 -
Test:可在本地服务器运行时使用本地测试功能;用户也可以使用SwaggerHub中提供收费的在线测试功能,主要有MockServer(Auto Mocking)、问题跟踪(Issue Tracking) -
Document:可以在线或离线(包括代码编译时和运行时)地生成静态html、pdf等文档;SwaggerHub可以配合API版本,自动同步相应文档的版本 -
Share:SwaggerHub提供团队管理、联调开发、文档标注等多人合作开发的支持
④ 实时预览
⑤ Swagger支持YAML格式
⑥ Apiary的Design-Use-Implement流程
第二类:Apidocjs
第三类:Rap、eolinker
如何选型?
选型逻辑
-
社区活跃、功能完善,应用成熟。 -
学习成本低、上手时间短。作为业务开发,缺少时间熟悉学习曲线陡峭的知识和工具。 -
功能较多地契合上述优化方向。 -
能补充现有工作流的不足,不做大范围的代替。 -
要考虑测试环境处于内网造成的障碍。
初步分析
进一步分析
用Swagger2优化现有工作流
-
如果后端先编写独立的API设计文档,可利用Swagger在线编辑器或IDE插件的自动完成等特性;yaml格式统一、简单易懂、表达能力强,较markdown冗余字符更少。通过模仿官方Example很容易学习OpenAPI规定的关键字。 -
另外后端也可以把API设计文档直接通过注解的形式,标注在Controller类和相关方法上(以Spring MVC和Spring Boot为例),即可以通过Java反射在Maven Complie或运行时生成API设计文档。 有Intellij Idea的插件支持,Swagger注解则能利用现代Java IDE的特性,提高输入效率;另外完善的注解也方便其他开发人员进行后期维护,不需要在设计文档和代码实现中来回切换查看。此种方式相当于面向规约的开发模式,即先规定接口,再填充实现。
附录1:流程实例演示(脚手架为Spring MVC)
1. 标注相应的Swagger注解作为API设计文档
@Api("Users")
@RestController
@RequestMapping(value = "/users")
public class UserController {
@ApiOperation(value = "创建用户", notes = "根据User对象创建用户")
@PostMapping
public String postUser(@RequestBody User user) {
return null;
}
@ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息")
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return null;
}
}
class User{
private Long id;
private String name;
private String age;
//getter,setter
}
2. 生成API设计文档
3. 在Swagger-UI提供的可视化页面中完成自测
4. 与前端联调
附录2:Swagger配置与使用
https://segmentfault.com/a/1190000010911014
附录3:YAML格式的API描述文档示例
swagger: '2.0'
info:
description: Click Link Below for Help
version: v1
title: demo13
termsOfService: 'http://www.github.com/kongchen/swagger-maven-plugin'
host: HOST
basePath: /s
tags:
- name: Users
schemes:
- http
paths:
/users:
post:
tags:
- Users
summary: 创建用户
description: 根据User对象创建用户
operationId: postUser
parameters:
- in: body
name: body
required: false
schema:
$ref: '#/definitions/User'
responses:
'200':
description: successful operation
schema:
type: string
'/users/{id}':
get:
tags:
- Users
summary: 获取用户详细信息
description: 根据url的id来获取用户详细信息
operationId: getUser
parameters:
- name: 'id'
in: path
required: true
type: integer
format: int64
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/User'
definitions:
User:
type: object
properties:
id:
type: integer
format: int64
name:
type: string
age:
type: strin
参考文献
2. http://www.mikestowe.com/blog/2014/07/raml-vs-swagger-vs-api-blueprint.php
3. http://springfox.github.io/springfox/docs/current/
4. http://www.cnblogs.com/softidea/p/6251249.html
5. https://github.com/swagger-maven-plugin/swagger-maven-plugin
6. http://www.infoq.com/cn/articles/swagger-interview-tony-tam
7. http://www.cnblogs.com/softidea/p/5728952.html
8. http://www.infoq.com/cn/articles/description-discovery-profiles-primer
9. http://blog.didispace.com/springbootswagger2/
10. https://afoo.me/posts/2015-03-17-api-design-and-documentation.html
11. https://haofly.net/swagger/
- END -
5.
以上是关于有没有想过?前后端分离实践中如何提升 API 开发效率 ?的主要内容,如果未能解决你的问题,请参考以下文章
效率专精:前后端分离实践中如何提升RestAPI开发效率建议精读