不知道大家知不知道一个事情:就是我们在进行测试post请求的时候,见到过字段名是相同的情况,比如:
这个postman请求体,三个字段都一样,都是a
这种情况,我们来看下postman的请求代码生成:
postman中,只是忠实的把这个请求体转换成了字典,然后在地下直接通过data=payload的方式传递了出去。
那么这种写法是正确的么?
答案是:
在没有同名字段的时候,是可以的。
但是一旦有同名字段,就不对了。
我们把这段代码复制到pycharm中来详细验证一下:
注意,还没开始运行,pycharm已经在警告了。我们运行一下看看:
结果正常显示,但是这是因为本接口是作者随便找的例子,并没有真正的需要字段a,甚至3遍!所以大多数情况下,我们很难去注意到这个细节bug。
那我们要怎么来验证下呢?答案很简单,我们通过response,来输出它真实的请求体:
输出:
可以看到,它的请求体只有一个a,而且等于最后的值3,前面的1 和 2都被抛弃掉了。
我们再来修改请求体测试下:
再看看结果:
可以看到,b成功显示来了,但是a仍然只留一个最新的值。
所以这个写法是错误的。
大家不用怀疑了,因为博主今天测试接口,检查数据库的时候发现的这个情况,数据库中只保留了同名字段的最后一次值,所以排查出此问题,源头就是postman的请求代码的bug。
那这里我们要怎么修改,才能让这个a=1 a=2 a=3 b=5 同时当作请求发出去呢?
其实很简单,这里要弄明白,postman为什么会出现这个bug,原因是:很多人平时都会简单的把python中的字典,看作是 json格式。
而postman的开发者显然也这么认为,甚至我们在所有的python-requests的教程中,请求体都是这样字典的格式存在。
但是,这不行! 原因很简单, json允许 同名字段存在!而字典不允许!
所以我们在程序中加上这样一句打印:
然后就看到了问题所在:
在这个字典刚写完的时候,实际上已经自动去重了...... a=1 和a=2已经被丢弃了。
那这里我们要怎么修改呢?其实只要找一个新的格式来代替字典即可,它要具备俩种特性:
1.允许同名字段
2.可以被requests成功发出
3.可以让服务器成功解析
那么这种格式是什么?就是多元元组。
说的太多大家也不好理解,直接看代码吧,把格式改成这样:
怎么样,看着是不是怪怪的,圆圆滚滚的还有点可爱~
直接请求:
可以看到结果,成功的保存了同名字段a的所有值,并且被requests所认可,因为这是通过response.request.body打印出来的哦~
在博主自己的企业接口测试中,这种写法也成功的被服务器解析,数据库中查到了同名字段全部的值~
(这个bug刚刚提交给postman团队了,希望能引起重视吧~)
那么这个问题,我准备在下一节当中,去我们的接口测试平台上进行改造!
最后贴上git地址:https://github.com/Woqurefan/ApiTest