大多数开发者可能都用过Postman,根据其官网的介绍:Postman是一个用于构建和使用API的API平台,简化了API生命周期的每个步骤,提供更便捷的团队协作,因此可以更快地创建更好的API。这里的API,除了我们常用的HTTPAPI之外,还包括Websocket(BETA),gRPC。本文中,我们将以最常用的RESTAPI作为例子。 假设我们在开发一个类似微头条的项目,你是一个后端开发人员,前端分为手机端和网页端,而由于采用了RAD或者敏捷开发方法,你随时需要将在开发环境测试好的最新的API改动发布至测试环境(或Stage环境),并为测试人员或者前端开发人员提供最新的API文档。下面我们看看在这个过程中,Postman能如何帮助简化API声明周期以及提供更便捷的团队协作。开发阶段 在这个阶段,不管后端使用什么语言开发,最终开放的是RESTAPI接口,在本文的示例中,我们使用Jmix〔1〕框架开发基于服务的RESTAPI。Postman的最基本用法,就是开发人员可以在这一步建立一个API集合(Collection),其中包含项目的所有API,这里我们创建了一个叫Corp的集合,包含所有功能的API: 单个请求 图中重要的三个部分:API集合单个API的请求方式(POST)和请求地址单个API请求体 到这一步为止,就是Postman的基础用法了,我们创建一个API集合,而集合是支持导出的,可以导出为JSON文件,再发给其他同事,他们可以导入到Postman里面使用。使用变量做第一次优化 在上面的图中,我们展示了集合中的第一个接口获取Jmix本地token。而这个token,我们需要在以后的每个请求中都用来做用户认证。如下图: 请求认证 这里有一个问题,就是token会过期,比如我们今天拿到的token,可能明天就没法再次使用了。而我们需要再次获取token,然后挨个复制到每个请求中吗?这个未免太麻烦了。Postman提供了环境变量的机制。有三种类型的变量,分别是:全局变量(Globals):顾名思义,这里定义的变量在所有集合的所有API中都可使用。集合变量:在集合中,有一个Variables标签页,可以定义集合级别的变量,这些变量,只能用于集合内的API。环境变量:需要建立一个环境变量的集合,这里面可以定义一组该环境内的变量,可以用在任何集合。后面我们会说到用法。 Postman变量定义 我们可以声明一个名为jmixToken的集合变量存储token,至然后在请求中使用{{jmixToken}}的方式引用变量即可: token存储 除了token之外,我们在API中使用的相同类型的参数也都可以声明为变量,而变量可以用在请求的任何部分。例如,我们在发新帖的API中使用的请求体如下,我们分别使用了Postman提供的随机生成UUID的guid变量、集合中存储测试用户Id的userId变量,以及存储我们博客地址的blogUrl:{postId:{{guid}},userId:{{userId}},content:欢迎访问:{{blogUrl}}}使用脚本进行第二次优化 经过了上面的第一轮优化后,我们的API里面会多了许多变量。但是还存在一个问题,就是我们在拿到token后,仍然需要手动更新一下jmixToken这个变量,否则各个API仍然使用的是过期的token。这还是有点麻烦。 好在Postman提供了测试脚本的功能,可以解决这个小麻烦,我们需要在获取token的请求中编写一个测试脚本,用于更新jmixToken,这样我们一旦重新获取了token,就可以保证其他API使用的是最新的token。 编写代码的位置如下图所示,在API的Tests标签页。并且更贴心的是,Postman在右侧给了一些常用的代码片段,点击即可使用,例如,获取全局变量、设置集合变量等。 测试脚本 测试脚本是JavaScript的,可能需要有一点JS基础,具体每行的作用,请参考注释。这里我们对返回结果做了两个测试,分别是验证HTTP状态码必须是200以及检测返回结果中必须包含accesstoken这个属性。需要注意的是,这两个测试如果有任意一个失败,都将抛出异常直接退出JS的执行,此时不会走最后一句设置变量的语句:pm。test表示这是一个测试。pm。test(SetGlobalvariablejmixToken,function(){测试1返回状态码为200pm。response。to。have。status(200);获取返回结果的jsonvarjsonDatapm。response。json();测试2返回的json中必须有accesstoken字段pm。expect(jsonData)。to。have。property(accesstoken);设置全局变量jmixTokenpm。globals。set(jmixToken,jsonData。accesstoken);}) 这里我们还可以做一点优化,那就是针对上面代码中的测试1,我们检查了HTTP的返回状态码为200,其实针对所有的请求,我们可能都需要做这个检查,那么如果不复制粘贴代码,有没有简化的方法呢? 有的,Postman提供了集合级别的测试脚本,定义在集合中的测试脚本,会对每个API都适用。比如,我们可以把验证HTTP状态码的测试放到集合中: 集合测试脚本小结 到这里,我们开发阶段对于请求的优化就结束了,通过使用变量,可以优化API中的数据,将相同的数据都定义在变量中。通过测试脚本,我们可以对API进行测试,也可以更新各种变量,避免手动修改的麻烦。我们的示例中演示的更新token是最常见的脚本功能,除此之外,比方说我们要测试的发帖和回帖功能,可以在发帖后将帖子的ID保存在变量中,测试回帖功能时,直接使用变量存储的帖子ID,这些具体的业务场景,可以根据项目灵活变化。测试阶段 开发完成后,我们就需要将API部署至测试或者Stage环境,交给测试人员或者前端开发人员进行试集成了。那么在这个阶段,你或许想在测试人员工作前自己先测试一遍,或者如果测试有问题,而你作为后台开发人员,也难免需要直接调用测试环境的API观察输出结果。这就有了一个新的问题:我们在之前的接口定义都是http:localhost:8080开头的地址,怎么能方便地切换到测试地址呢? 答案还是用变量。但是这一次,我们使用的是环境变量集合。 例如,我们可以创建两套环境变量,分别为envdev和envprod,其中都定义了变量jmixAppUrl,在envdev中,该变量的值为http:localhost:8080,而在envprod中,该变量的值为https:your。test。env。ip:testport,然后修改每个请求,将原本的http:localhost:8080地址换成变量{{jmixAppUrl}}: 环境变量集合 使用时,通过右上角的环境变量集合切换功能,就可以切换不同的环境了。发布文档 如果你的测试或者前端也使用Postman,那么可能导出API集合文件再交由同事导入,可能是比较方便的方法。但其实Postman在文档发布这个功能上,也做了不少工作。 右键点击集合,有一个Viewdocumentation菜单,或者通过下图的按钮也可以查看集合的文档 集合文档 在查看文档时,右上角有一个Publish按钮,可以将你的文档公开发布,并提供一个URL地址用于访问。这样的话,其他同事如果不使用Postman,只需要访问该地址,就可以看到API的文档。 发布文档 在发布时,可以选择环境变量集合,这样会用集合内的变量值直接替换API中的所有变量,这样一来,看文档的人不会读到看不懂的变量。下图是一个发布的文档示例,前端用户还可以根据编程语言,选择对应的代码样例: 发布的文档 发布后的文档会实时更新,也就是说,任何你在Postman中对集合API的修改都会实时同步至文档中。比如新增或删除某个API、修改API请求体等等。项目级别优化 其实,我们最后还做了一个项目级别的优化,这个案例可能不具有通用性,但是也可以给大家一个思路:公共API抽离 由于我们的项目后台都是基于JmixCUBA框架开发的,因此,我们做了如下改动:新建Postman集合JmixCUBA通用接口,其中包含了Jmix和CUBA各自获取本地token的API,以及从我们SSOIDP获取token的API。新建全局变量存储token,全局变量有jmixToken,cubaToken,ssoToken。并且在上述三个接口的测试脚本中,分别更新这三个全局变量。 这样做的好处是,不需要在每个项目中单独提供获取token的API,并能保证获取的token全局可用。统一添加Authorization请求头 在业务API集合中,我们为Collection添加了PrerequestScript,这个脚本会在集合内的每个请求发出前先执行。我们就是用这个脚本为请求添加请求头,代码很简单,例如,对于使用ssoToken和jmixToken的Jmix项目,我们是这样做的: 请求头脚本 因此,对于集合内的每个请求,不需要单独设置Authorization请求头了。统一业务API返回结构 最后,我们在代码层面对每个业务API的返回结构做了统一,都使用这样的返回结构:publicclassRestResultTextendsSerializableimplementsSerializable{业务状态码privateintbusinessCode;提示信息privateStringmsg;数据privateTdata;。。。} 我们为所有的成功返回都定义了同一个businessCode,这样的话,在Postman的Tests脚本中,可以添加代码直接检查业务层面的返回结果是否成功,例如,我们定义10000为业务结果正确的返回值:pm。test(Successreturn,function(){pm。response。to。have。status(200);pm。expect(pm。response。json()。businessCode)。to。eql(10000);})结语 本文介绍了一些使用免费Postman的进阶技巧:变量、脚本、文档发布。而现在Postman也在往SaaS方向发展,推出了团队协作功能,像文档发布、API导出导入这些功能在团队模式下用不到了,因为API集合可以协作完成,文档也可以团队内共享。Postman作为一款API平台,确实能在一定程度上提升团队的开发效率和协作。参考资料 〔1〕Jmix:https:www。jmix。cn