合作方参照我方原有接口文档,编写的接口,用原有的测试脚本测试,几乎所有put请求会报450参数不合法的错误(450自定),而用合作方附带的python接口脚本则put请求基本能通。确认过参数,路径,请求方法,无法找到原因。后突然想到改变一下Jmeter发送请求方式,结果原先450参数不合法的问题消失了。leader之前也建议用抓包工具分别抓取Jmeter和python脚本的请求,比对一下发送的参数。
原先误以为,不管是在Parameter还是BodyData发送请求参数,都是一样的,不知道以不同方式发送会形成不同数据类型,而什么数据格式合法又受服务器端代码制约(合作方没有说明要以什么类型发送数据)。
一开始是按旧有的测试脚本,稍作更改发送put请求,结果是450.
换成Parameter中发送参数或者更改BodyData 中的数据构成方式,则结果变为200,ok, 如下所示:
经了解,Parameters和BodyData发送请求参数有如下区别:
- 在JMeter使用Parameters发送参数时,Content-Type默认为application/x-www-from-urlencoded。查看Jmeter请求头或抓包所得,皆如图所示
- 在JMeter使用Body Data消息体数据时,若输入参数是json数据格式,Content-Type只能传application/json;输入的数据是键值对的形式(如:type=username&accounts=jmUser05&pwd=123456),Content-Type只能传application/x-www-from-urlencoded。
然而实际上,当在BodyData 中使用键值对形式时,即使不设置http请求头为application/x-www-from-urlencoded,依然能够成功发送请求并返回200 OK,而此时显示的发送数据类型为text/plain, 这不知道是不是服务器端代码不严谨导致。
资料参考:https://www.cnblogs.com/Sharing-knowledge/p/17205573.html
关于Content-Type,学习了下http://t.csdn.cn/iGAHm此篇博文有比较详细的比对和介绍:
- request header中的Content-Type 告诉服务器发送的参数是什么类型。response header中的Content-Type告诉客户端返回的参数类型。
- Content-Type 规定了请求体中的数据编码格式,针对不同编码格式的数据,服务端的解析方式不同。
总结一下,测试接口时应弄清服务端支持的参数类型,进而在使用Jmeter或其他工具进行测试时能选择正确的方式以及做好request header 设置。如果无法弄清,可自行尝试变换参数类型发送请求。