1-测试 - Postman篇之特殊接口
about
除了快速上手部分的那些基本的接口,还有一些其他特殊的接口,比如签名接口校验、携带cookie和token的接口等等。
签名接口
在写开放的API接口时是如何保证数据的安全性的?我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如:
- 请求来源(身份)是否合法?
- 请求参数被篡改?
- 请求的唯一性(不可复制)
为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证。
那postman中怎么校验这种类型的接口呢?
这个url接口,来演示一下:
# URL
http://www.neeo.cc:6002/pinter/com/userInfo
# 类型
POST
# 参数
{"phoneNum":"123434","optCode":"testfan","timestamp":"12112121212","sign":"Md5(手机号+盐+时间戳)"}
上面的参数中,需要手机号,optCode
字段是个固定值testfan
,这个别改;时间戳字段timestamp
是当前的时间戳,sign
字段是需要一个算法来生成的。
这个接口的签名算法为:
sign = Md5(手机号+盐+当前时间戳) # 加号代表拼接
很明显,这些操作,都要在postman中操作,那么比如获取时间戳和加密都需要JavaScript来完成,我们先来把用到的知识点列出来:
// 获取时间戳
var t = new Date().getTime();
// 加密
var md5 = CryptoJS.MD5("需要加密的字符串").toString();
// postman保存变量
pm.environment.set("要保存的变量名", md5)
来看postman中怎么测试。
首先要说的是,参数中的需要的数据,都需要在发送请求之前配置到位,那么在哪处理,又怎么处理呢?
// 1. 处理手机号 phoneNum
var myPhone = "18211101111"
// 2. 操作码 optCode
var myOptCode = 'testfan'
// 3. 时间戳
var myTimeStamp = new Date().getTime();
// 4. 将上面的3个变量拼接起来
var myData = myPhone + myOptCode + myTimeStamp;
// 5. 使用md5加密
var mySign = CryptoJS.MD5(myData).toString();
console.log(myOptCode, myTimeStamp, myData, mySign);
// 6. 将相关变量添加到postman中
pm.environment.set("myPhone", myPhone);
pm.environment.set("myOptCode", myOptCode);
pm.environment.set("myTimeStamp", myTimeStamp);
pm.environment.set("mySign", mySign);
首先,我们确定了这些操作要在请求发送之前处理好,那么我们就先将上述整理好的代码粘贴到合适的位置。
如下图,在Pre-request Script
中,编写代码。然后在控制台中,看看查打印结果,可以看到,已经加密成功了,说明我们的代码逻辑没有问题。
来看原来的参数:
{"phoneNum":"123434","optCode":"testfan","timestamp":"12112121212","sign":"Md5(手机号+盐+时间戳)"}
现在, 我们需要将相关的字段替换为我们之前添加到postman中的变量,下面是替换后的json串。
{"phoneNum":"{{myPhone}}","optCode":"{{myOptCode}}","timestamp":"{{myTimeStamp}}","sign":"{{mySign}}"}
然后,我们将替换后的json字符串替换到请求的body中,然后发送请求,查看响应结果。
ok,经过一系列的操作,我们终于将这个签名接口调通了。
cookie
再来看postman如何处理需要携带cookie的接口。
先来一个场景,用户需要登录某网站,登录成功,返回一个cookie,然后用户需要携带cookie在进行进一步操作,比如查询余额等。
我们测试这种类型的接口时,有两种方式:
- 第一种,就是我们使用浏览器登录,获取cookie值,然后手动携带。
- 第二种,就是借助postman帮我们自动的管理cookie值。
先来看第一种方式。
登录接口的相关参数:
url: http://www.neeo.cc:6002/pinter/bank/api/login
类型:POST
参数:userName=admin&password=1234
查询余额接口相关参数:
url: http://www.neeo.cc:6002/pinter/bank/api/query
类型:GET
参数:userName=admin
查询余额接口必须依赖登录成功返回的cookie。
首先,我们需要在浏览器中访问http://www.neeo.cc:6002/pinter/bank/page/login连接, 输入admin&1234
进行登录,登录成功后,我们获取到了cookie值。
现在,保持登录状态,我们使用postman访问查询余额接口http://www.neeo.cc:6002/pinter/bank/api/query?userName=admin。
暂时还没有加cookie,我们查询余额失败。现在,我们从浏览器中拷贝cookie值,添加到查询余额的请求头中,再次访问。
这种相对比较麻烦。
我们来看第二种,在postman中,新建一个登录的接口。
然后,我们在查询余额接口中,就不用携带cookie了,直接访问即可。
现在,发现,访问成功了。如上图,我们打开Temporary Headers
,发现本次请求,postman自动的帮我们携带了cookie,才能访问成功。
其实,postman自动的帮我门管理了cookie。在哪看呢,点击上图中的绿色框中的Cookies
可以发现那个cookie值。
这里也可以自己添加cookie,看你需求吧。
token
来研究一下postman如何处理需要携带token的接口。
这里用到postman的数据管理的功能,该功能对token进行处理。
关键步骤:
// 从响应中获取json数据
var jsonData = pm.response.json();
// 从json中的相应字段提取token
var myToken = jsonData.meassage;
// 将token值set到postman中,方便后续引用
pm.environment.set("myToken",myToken)
来个场景, 还是登陆后进行后续操作,只是需要携带token了。
登录/查询余额接口相关参数:
# 登录
url:http://www.neeo.cc:6002/pinter/bank/api/login2
类型:POST
参数:userName=admin&password=1234
# 查询余额
url:http://www.neeo.cc:6002/pinter/bank/api/query2
类型:GET
参数:userName=admin
第一种方式,仍然为自己在浏览器(建议是用火狐浏览器抓包,谷歌貌似抓不到)登录,然后抓包,抓到token值。
然后在查询余额中携带。
现在就OK了。
第二种,就是使用postman的数据关联的功能了。
首先,我们配置登录接口,然后从响应的json中提取token,然后将token保存到postman的环境变量中。那在哪写提取token的代码呢?还记得Tests
吗?它是响应后要干的事情,之前我们用它来做断言。现在用它来提取token值。
我们也可以去环境变量中查看刚刚添加的token值。
然后在后续的查询余额中,引用环境变量中的token值,只要这个token值不过期,我们查询余额就能一直用,过期了,再访问一下登录接口就行了。
ok,完事了。
webservice接口
还有一种接口就是webservice类型的接口。
简单来说,webservice是通过xml进行交互的web请求。
Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
可以通过soupui来测试,也可以通过jmeter来测试。
常用webservice接口网站:
http://wcf.open.cnblogs.com/news/help/operations/GetNewsList#response-xml
http://www.webxml.com.cn/zh_cn/index.aspx # 这个网站提供了很多webservice接口
url和相关参数:
# http://fy.webxml.com.cn/webservices/EnglishChinese.asmx
# post类型
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<TranslatorSentenceString xmlns="http://WebXml.com.cn/">
<wordKey>string</wordKey>
</TranslatorSentenceString>
</soap:Body>
</soap:Envelope>
在Body
中选择raw
,类型选择XML
,参数中,需要将string
替换为实际的单词。
现在,点击Send
发送请求。
遇到了问题,响应状态码是415,不支持的媒体类型,这是怎么回事?原因是,当我们选择类型为XML
时,postman会自动的在headers中添加Content-Type:application/xml
。
原因就是出在Content-Type
这里,类型自动添加的不对,那到底是什么呢?我们看人家网站的说明:
是Content-Type: text/xml
,我们在postman中手动修改,然后再发送请求即可。
现在,这个接口就通过了。
欢迎斧正,that's all