LoadRunner(三)再识web_custom_request函数

来源:互联网 发布:易企秀数据怎么导出 编辑:程序博客网 时间:2024/05/17 22:54

web_custom_request函数在LR中使用非常普遍,特别是在手工脚本替代录制脚本的今天,几乎所有的请求都使用此函数来完成。
从理论上讲,该函数属于万能函数,完全可以替代web_link()、web_url()、web_submit_data()这些函数的存在。
事情是这样的:昨天在对某一接口进行脚本编写的时候,发现一个很奇怪的情况,该接口调用方式为:http://xxxxxxx/xx/xx?data=“json数据”的方式来进行;最初的想法是直接在web_custom_request函数的URL参数中拼接json数据,这种方式在最初的几条数据的情况下是可以完美的实现的,如下代码:

        web_custom_request("web_custom_request",                         "URL={URL}                         "Method=POST",                         .....                          LAST);

但是项目要求JSON数据至少需要上百条,这上百条数据拼接起来长度直接上2000字节,此时LR回放直接报错:

Action.c(44): 错误 -26631: 对于“http://......”,HTTP 状态代码=400 (Bad Request)      [MsgId: MERR-26631]Action.c(44): web_custom_request("web_custom_request") 最高严重级别为“ERROR”,324 个正文字节,179 个标头字节   [MsgId: MMSG-26388]Action.c(44): 错误 -27748: 生成 HTTP 请求时,缓冲区溢出。尝试增加运行时设置中的“网络缓冲区大小”。    [MsgId: MERR-27748]

之类的错误层出不穷,然后想到既然如此,为何不把内容写入Body中,这样发送的时候会自动分片,于是有了如下的写法:

        web_custom_request("web_custom_request",                         "URL=http://192.168.51.123:81/dc-api/action",                         "Method=POST",                         "Resource=0",                         "RecContentType=text/html",                         "Referer=",                         "Snapshot=t2.inf",                         "Mode=HTML",                         "EncType=text/html",                         "Body=data={param}",                          LAST);

运行后是不报错了,但是接口部分返回缺提示:

{"Result":false,"Message":"传入data为空","Code":"ERR-0x00000095","Version":"","Data":null}

这就奇怪了,然后修改了各种方法,都不行,最后进行了如下修改:

        web_custom_request("web_custom_request",                         "URL=http://192.168.51.123:81/dc-api/action",                         "Method=POST",                         "Resource=0",                         "RecContentType=text/html",                         "Referer=",                         "Snapshot=t2.inf",                         "Mode=HTML",                         "EncType=application/x-www-form-urlencoded",                          "Body=data={param}",                          LAST);

即指定了EncType为application/x-www-form-urlencoded的方式,接口提示成功了。

通过研究后发现,web_custom_request的EncType编码类型。此参数给出一个内容类型(Content-Type),指定其做为回放脚本时“Content-Type”请求头的值,例如“text/html”。Web_custom_request函数不处理未编码的请求体。请求体参数将会使用已经指定的编码方式。因此,如果指定了不匹配HTTP请求体的“EncType”,会引发服务端的错误。通常我们建议不要手动修改录制时的“EncType”值。
任何对于“EncType”的指定都会覆盖web_add_[auto_]header函数指定的Content-Type。当指定了“EncType=”(空值)时,不会产生“Content-Type” 请求头。当省略了“EncType”时,任何一个web_add_[auto_]header函数都会起作用。如果既没有指定EncType也没有web_add_[auto_]header函且“Method=POST”,
“application/x-www-form-urlencoded”会做为默认值来使用。其他情况下,不会产生Content-Type请求头。

在后面分析的时候,也是通过抓包方式发现了确实两种不同编码方式有不同的请求头,而不同的头在接口方向接收的时候处理会出现异常。

0 0
原创粉丝点击