LoadRunner(三)再识web_custom_request函数

本文探讨了在LoadRunner中使用web_custom_request函数时遇到的问题,特别是处理长JSON数据时的错误。通过实验和分析,解释了EncType参数对HTTP请求头的影响,以及如何正确设置避免服务端错误。建议在使用web_custom_request时注意Content-Type的匹配,以确保接口调用成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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请求头。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值