1-测试 - Postman篇之特殊接口

about

除了快速上手部分的那些基本的接口,还有一些其他特殊的接口,比如签名接口校验、携带cookie和token的接口等等。

签名接口

在写开放的API接口时是如何保证数据的安全性的?我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如:

  1. 请求来源(身份)是否合法?
  2. 请求参数被篡改?
  3. 请求的唯一性(不可复制)

为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证。

那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
posted @ 2020-01-13 17:50  听雨危楼  阅读(1027)  评论(0编辑  收藏  举报