loadrunner socket协议问题归纳(5)

获取服务器的返回值,可以用web_reg_save_param函数,该参数最好放到:

语法:

int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);

参数说明:

复制代码
o ParamName: 存放得到的动态内容的参数名称

o list of Attributes: 其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写

o Notfound: 当在返回信息中找不到要找的内容时应该怎么处理

o Notfound=error: 当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值。

o Notfound=warning: 当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。

o LB( Left Boundary ) : 返回信息的左边界字串。该属性必须有,并且区分大小写。

o RB( Right Boundary ): 返回信息的右边界字串。该属性必须有,并且区分大小写。

o RelFrameID: 相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。

o Search : 返回信息的查找范围。可以是Headers,Body,Noresource,All(缺省)。该属性质可有可无。

o ORD : 说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。

o SaveOffset : 当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0。

o SaveLen :当找到匹配项后,偏移量之后的几个字元存储到参数中。缺省值是-1,表示一直到结尾的整个字串都存入参数。
复制代码

 要获取返回值,那么有2种方法:

第一种方法是通过 SaveOffset 来获取指定的值,这个方法适用于返回的值或是格式比较固定,不会有什么变动,比如有些接口,返回1,表示已经响应成功,那么可以用这个方法来获取。或是返回来的字段顺序都不变,都可以使用该方法。但是当返回值的顺序有变,而我们要取指定的字段值时,就不适用了,在第二种方法再描述。

第一个接口请求后,服务器返回值:

    {"orderId":"9854578067073400832","message":"创建订单成功","status":100}

因为返回的数据格式比较固定,数据的顺序很少变化,那么可以用如下的函数来获取:

复制代码
     web_reg_save_param("orderId",
                    "LB=",
                    "RB=",
                     "ORD=1",
                     "SaveOffset=1",
                       "SaveLen=31",    //获取运行结果里的orderId    "orderId":"9854578067073400832"
                    "Search=Body",LAST);
复制代码

这种方法不是很灵活,很容易报错,当返回值有变动时或是返回值的顺序有变动,必须要重新修改,否则运行还是会报错。用第二种方法,通过取返回值的边界值,达到目的:

复制代码
     web_reg_save_param("orderId",
                     "LB=orderId",
                     "RB=message",
                      "ORD=1",
                      "SaveLen=23",
                     "Search=Body",LAST);
复制代码

会发现"SaveLen"取的值不一样,因为第一种方法取的值是"orderId":"9854578067073400832",第二种方法,取的值是":"9854578067073400832"

这里只需要传的参数修改一下就可以了,如我在用第一种方法时,用如下的参数:

     {"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX",

如果用第二种方法,用如下的参数:

     {"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX","orderId

取得返回值,用如下的数据进行拼接:  

      lr_save_string(lr_eval_string("{NewParam}{orderId}}"),"orderId2");

因为代码里面的4接口是业务的一个部分,但在测试接口的时候,可以不用管,所以只是放在代码里面尽可能的模拟业务而已,实际在本代码中,没有什么用处,是5接口创建订单号orderId给第18接口,并作为第18个接口的参数进行请求,完整的代码如下:

复制代码
Action()
{
/*
18接口的参数
{"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX", {"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX","orderId 5接口的参数 {"account": 13900001111,"payMoney":0.01}

4接口的参数 {"account": 13900001111} */ //18扫描支付接口的前半部分参数 char * tmpParam = lr_eval_string("{NewParam}"); //5创建订单接口的参数 char * tmpParam2 = lr_eval_string("{NewParam_2}"); //4获取商户开通支付方式 char * tmpParam3 = lr_eval_string("{NewParam_1}"); web_set_proxy("10.16.1.151:180"); //设置请求头,没有这个,请求会不认得 web_custom_request该函数的json请求 web_add_header("content-type","application/json"); lr_save_string(lr_eval_string("{NewParam_1}"),"tmpParam3"); web_custom_request("4","URL=http://10.16.1.151:180/getMerchantPayType","Body={tmpParam3}","Method=POST","mode=HTML",LAST); web_add_header("content-type","application/json"); //把5创建订单的参数,获取过来,赋值给tmpParam2 lr_save_string(lr_eval_string("{NewParam_2}"),"tmpParam2");//获取5接口返回的参数,指定的参数SaveOffset=31,然后赋值给orderId /* web_reg_save_param("orderId", "LB=", "RB=", "ORD=1", "SaveOffset=1",//获取运行结果里的orderId 45 "SaveLen=31", "Search=Body",LAST); */ //获取5接口返回的参数,指定的参数,然后赋值给orderId web_reg_save_param("orderId", "LB=orderId", "RB=message", "ORD=1", "SaveLen=23", "Search=Body",LAST); //5接口创建订单,向服务器请求 web_custom_request("5","URL=http://10.16.1.151:180/onlineOrder","Body={tmpParam2}","Method=POST","mode=HTML",LAST);
//返回的参数 {"orderId":"9854578277036064768","message":"创建订单成功","status":100}
//获取5接口返回的参数orderId赋值给orderId lr_save_string(lr_eval_string("{orderId}"),"orderId"); //打印获取服务器回复指定的参数 lr_output_message(lr_eval_string("{orderId}")); //参数并接,赋值给orderId2,作为18扫描支付接口的参数 会发现这里有2个},参数里面因为少了一个},所以在参数后面补充} lr_save_string(lr_eval_string("{NewParam}{orderId}}"),"orderId2"); lr_output_message(lr_eval_string("===========:{orderId2}")); web_add_header("content-type","application/json"); //扫描支付接口请求 web_custom_request("18","URL=http://10.16.1.151:180/scanPay","Body={orderId2}","Method=POST","mode=HTML",LAST); return 0; }
原文地址:https://www.cnblogs.com/VseYoung/p/loadrunner_5.html