Postman是我们在工作中使用频率很高的一款API调试工具。估计很多童鞋用起来比较粗糙。填写接口地址和参数,直接发送。估计大家要说了,这么简单的东西能开出什么样的花呢。今天给大家分享几个很实用的功能,可能一直以来都被大家忽略了。用了之后简直不要太香!环境变量下面通过一个例子来看看环境变量的用法。在一个项目的生命周期中,可能会有开发环境、测试环境、预发布环境、线上环境等多种不同的环境。这时可以通过环境变量来管理接口的地址和端口。点击左侧的Environments,系统默认已经存在一个Globals全局环境,可以存放一些常用的公共变量值。这里先写host和port信息:当需要用到变量时,可以在访问接口时用双花括号把变量包起来,用{{variable}}引用:除了默认的全局环境,还可以还可以创建自己的新环境来存储变量。在下面的例子中,创建了local和test两个环境,这样我们就可以直接在两个环境之间切换激活,简化了开发时测试接口的过程,并且不需要改变接口的地址频繁地。如果激活的环境和全局环境中存在重名的变量,那么当前激活的环境中的变量具有更高的优先级,它会直接覆盖全局环境中变量的值:上面,我们划分了环境变量分为两类,普通环境变量和全局变量。一般来说,全局变量的使用范围比较大。即使切换到自己创建的环境,全局变量仍然可用。但是我们创建的环境是相互隔离的。如果我们切换到一个环境,其他环境中的变量将不再可用。像上面这样手动写变量的值,在某些时候可能不方便满足一些需求,所以postman提供了一种方法,允许使用脚本来改变环境变量的值。我们来看看发送请求中的Pre-requestScript和Tests模块。它们是在发送请求之前或之后执行的脚本。具体使用后面会介绍。现在我们只需要知道js代码到这里就可以执行了。接下来在Pre-requestScript中添加两行js代码:pm.globals.set("key1","value1");pm.environment.set("key2","value2");执行请求后再次查看环境变量,全局环境和当前环境都写入了新的值:同样,也可以使用脚本删除变量:pm.globals.unset("key1");pm.environment.unset("key2");除了上述两类变量之外,postman中的Collection也可以存储变量。Collection可以理解为集合。通常,我们会将一个应用系统中的接口放在一个集合中。集合中的变量使用范围较小,只在当前集合中可用:同样,也可以在脚本中对其进行操作:pm.collectionVariables.set("key3","value3");pm。collectionVariables.unset("key3");有了环境变量的基础之后,回过头来看上面提到的Pre-requestScript和Tests,是两个比较相似的功能,也很好用。Pre-requestScript运行js脚本Pre-requestScript可以翻译为预请求脚本,也就是发送请求之前执行的代码逻辑,可以在这里执行一些js代码。通过下面这个简单的例子来演示,首先准备一个后台接口,将前端传过来的时间戳转换成时间打印出来:@GetMapping("test1")publicvoidtime(@RequestParam("time")Stringtime){Datedate=newDate(Long.parseLong(time));System.out.println(date);}使用Pre-requestScript中的js代码获取当前时间,放入集合变量中,在请求中传递给后端:发送请求,控制台打印前端接口的调用时间:TueAug0114:14:29CST2021发送get请求Pre-requestScript的另一个大用处是在请求当前接口之前通过执行脚本来请求其他接口。在postman中,已经内置了sendRequest方法来发送get方法请求。这里我们调用了一个本地接口,将信息打印到console控制台(可以通过ShowPostmanConsole开启)。通过控制台的打印顺序,也可以看出真实目标接口的请求是先执行Pre-request中的请求之后执行的。如上直接调用sendRequest时,默认发送get请求。如果需要使用post请求,配置请求头或者使用json传递参数,可以使用下面的方法单独封装请求。发送post请求这里我们通过一个例子来演示Pre-requestScript在具体工作中是如何应用的。有一个很常见的场景。通常在调试需要授权认证的接口时,需要事先通过接口获取一个token,然后在访问目标接口时携带这个token。这时可以在Pre-requestScript中先调用接口获取token,然后将token设置到集合的环境变量中,在后续的接口调用中引用。这里先准备一个使用Shiro+JWT的项目,其中通过登录接口获取token,之后的其他接口都需要带上这个token进行认证。我们在sendRequest发送的get请求的基础上做一些修改。首先定义一个变量,用url指定请求地址,method指定请求方法,body携带参数,最后用sendRequest发送请求。获取token后,通过如下代码将获取到的token放入Collection的变量中:pm.collectionVariables.set("TOKEN",response.json().data.token);查看Collection中的变量,已经保存了刚才获取到的token:在需要认证的接口的header中,引用这个token,然后接口就可以正常调用了:在上面的例子中,我们使用urlencoded形式传递参数方法,如果接口定义使用json参数可以通过如下格式传递:body:{mode:'raw',raw:JSON.stringify({key:'value'})}如果需要传递header请求header信息,也可以在自定义请求中使用Add:constloginRequest={url:'...',header:['Key1:Value1','Key2:Value2'],...};具体使用需要添加哪些字段非常灵活,可以自行决定配置。Tests和Pre-requestScript是相反的,Tests是请求完成后执行的操作。这里我们回顾一下上面Pre-requestScript中发送post请求的例子,其实可以通过Test来改进。因为在上面的例子中,获取到的token是由JWT生成的,有一定的有效时间,在一段时间内可以重复使用。因此,我们可以手动调用一次登录接口获取token,然后使用Tests中的脚本将获取到的token放入Collection的变量中,这样就不需要之前多次调用登录接口获取token了每次调用接口。调用登录接口并存入缓存的过程:在调用其他需要携带此token的接口时,使用{{TOKEN}}自动填入刚刚保存的TOKEN值。这样在获取到新的token后,各个接口中的token都会自动更新,不需要手动复制到各个接口中,大大减少了工作量。在postman中,Collection中可以创建Folder文件夹,也可以在集合和文件夹中添加Pre-requestScript和Tests脚本。我们来看看位于Folder中的request,执行Pre-requestScript和Tests时的顺序是怎样的,并在每个链接中添加相应的print语句,最终输出结果是这样的:即发送request之前,postman会先执行所有的Pre-requestScripts,顺序是collection在前,folder在后,request中的最后一个。实际请求执行完毕后,所有的Test都会按照上面的顺序执行。这也需要我们在使用Pre-requestScript和Tests函数之前,对接口调用顺序和数据流有一个清晰的认识,以保证不会出现取值失败或更新错误。本文转载自微信公众号“码农仓上”,可通过以下二维码关注。转载本文请联系码农公众号。
