1. 引言
大家在调用第三方接口时,通常都会得到ClientID
和 SecretKey
,然后再通过签名后才能请求第三方接口。那么,在仅仅使用Postman的情况下,能否完成这样繁琐的签名操作呢?答案是肯定的。接下来让我们一起了解Postman的强大之处。
2. 服务端
首先我们看看下图服务端的校验逻辑:
细心的朋友可能会发现,这里我只获取了请求中的Sign和Timestamp,而MasterKey是直接从配置中获取。本文重点讨论Postman的接口签名,所以简化了服务端的逻辑。需要了解接口签名设计的可以自行搜索学习,本文不做阐述。
这里我们可以看到接口请求中需要包含x-sign
和x-timestamp
,签名规则为 MD5(${masterKey}.${timestamp}) 了解到接口验证规则后,我们可以继续往后走。
3. 构造请求
咳咳,接下来到本文重点。首先看看Postman的主界面:
为了方便后续的测试,我们先把Host和MasterKey添加到环境变量中:
紧接着我们把请求方式、接口地址、请求Body依次填写完整:
好了,内容都填好后,我们要往Headers里填写x-sign
和x-timestamp
:
现在问题来了,正常情况下我们需要在Headers里面填写固定的内容。但是现在我们要填写的x-sign
和x-timestamp
是需要计算出来的。无法直接填写,怎么办?
在解决这个问题之前,我需要补充一些知识点。让我们先来了解一下Postman的工作流程:
Postman每发起一个请求之前,都可以选择执行一段pre-request script。这恰恰给了我们机会在请求发起之前生成我们需要的数据。闲话少说,我们打开Postman中的pre-request script面板:
这里需要补充一下,pre-request script仅支持JavaScript语法。有了这个强大的功能,我们回过头来梳理下我们要做的事情:生成x-sign
和x-timestamp
。我们把任务分解成更小的步骤:
- 获取MasterKey
- 获得当前时间戳
- 计算MD5签名值
- 将时间戳和签名值填充到Headers
第一步非常简单,还记得刚才我们把MasterKey放到哪里了吗?没错,我们在一开始就把MasterKey放到了环境变量里,而面板的右侧有一个Snippet:Get an environment variable
,点击后即可得到获取环境变量的语句,我们稍加修改就变成这样:
第二步也不难,我们利用Date.now()生成当前时间戳:
接着我们继续下一步。咦,计算MD5???JavaScript并没有提供现成的计算函数,怎么办?Postman早就考虑到了这点,所以内置了一系列常用的库:
现在我们可以利用CryptoJS这个库来完成计算MD5值:
接着,我们在变量中添加sign
和timestamp
:
最后,我们在headers中添加{{timestamp}}和{{sign}}:
4. 验证结果
我们将写好的请求发出,并在服务端断点,看看是否能获取到x-sign
和x-timestamp
,并且对比计算出的sign是否一致:
签名结果一致,校验成功!
5. 总结
Postman是一个非常强大的接口工具,就像他说的那句话一样:
Postman Makes API Development Simple.
而我们也学习到如何在接口请求发起之前进行一些逻辑操作并且修改请求头的内容。顺带还给前端的同学粗略地了解后端的接口签名设计是如何工作的。后续我还会继续挖掘Postman的一些好玩的技巧,帮助大家更好的利用Postman来提高效率。