0%

使用postman脚本

postman 是一款 http 调试客户端,普通的请求非常简单,但是有的时候服务商提供的接口,可能需要加密,动态时间戳,随机字符串等,如果我们在参数中手动填写这些信息,每次都要填写会比较麻烦。

针对上面的问题,postman 预留了一个 pre-script 的功能给我们,在发起请求之前会执行这个脚本,我们可以在这里写 js 动态的生成一些参数,这个预先脚本可以是针对整个 collection,或者 collection 下的某个 directory,也可以具体到某个请求,优先级是由下至上。

接下来以调用阿里云的短信接口为例

文档地址

  1. 根据文档,我们先填好接口必要参数,每个参数的意义可以根据文档提示填写

  1. 在请求 api 之前有些公共参数需要填写,这部分可以放到一些公共集合或者公共目录下,该集合或者目录下的所有请求都会共用该脚本
    文档地址

完整脚本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
accessKeyId = "accessKeyId" // 填写自己的 keyID
accessKeySecret = "accessKeySecret" // 填写自己的 keySecret
pm.request.url.addQueryParams(["AccessKeyId="+accessKeyId, "SignatureMethod=HMAC-SHA1", "SignatureVersion=1.0", "Version=2017-05-25"])
// SignatureNonce 签名唯一随机数,每次请求使用不同的随机数
function generateSignatureNonce(e) {
e = e || 32
var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678"
a = t.length
n = ""
for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a))
return n
}

signatureNonce = generateSignatureNonce()
pm.request.url.addQueryParams(["SignatureNonce="+signatureNonce])

// Timestamp 时间,按文档要求生成
timestamp = (new Date()).toISOString()
pm.request.url.addQueryParams(["Timestamp="+timestamp])

// 生成 sign,具体算法看文档

// 先把query参数组成 key:value 格式的对象
let querys = {}
pm.request.url.query.all().forEach((param) => {
key = param.key
value = param.value
Object.assign(querys, {[key]:value})
})

// 特殊url处理
function specialUrlEncode(url) {
url = encodeURIComponent(url)
url = url.replaceAll("+", "%20").replaceAll("*", "%aA").replaceAll("%7E", "~")
return url
}

// key 排序拼接 value
// 根据文档要求特殊拼接
keys = Object.keys(querys).sort()
let str = ""
keys.forEach((key) => {
str+=specialUrlEncode(key)+"="+specialUrlEncode(querys[key])+"&"
})
// 去掉最后一个&
str = str.substring(0, str.length-1)
str = "GET&"+specialUrlEncode("/")+"&"+specialUrlEncode(str)

// hmac-sha1加密,且 base64 encdoe
sign = CryptoJS.HmacSHA1(str, accessKeySecret+"&").toString(CryptoJS.enc.Base64)
sign = specialUrlEncode(sign)
pm.request.url.addQueryParams(["Signature="+sign])

上述脚本主要使用了 js 基础语法,以及一些 postman 自己封装的 api,和 postman 提供的一些第三方 npm 包(比如 CryptoJS),具体有哪些可以使用就需要多上官方文档查询了

postman 脚本相关文档

动态参数

脚本相关api