获取服务器的返回值,可以用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;
}

loadrunner socket协议问题归纳(5)的更多相关文章

  1. loadrunner socket协议问题归纳(6)

    首先让我们先看一下loadrunner- winsock 函数 一览表: lrs_accept_connection 接受侦听套接字连接 lrs_close_socket 关闭打开的套接字       ...

  2. loadrunner socket协议问题归纳(3)

    摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发 ...

  3. loadrunner socket协议问题归纳(0)

    一.概述         Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作.     二.socket概述         soc ...

  4. loadrunner socket协议问题归纳(1)

    前段时间测了loadrunner直接发送报文到socket上的性能测试.在此,稍微回顾整理下. 与socket通讯,有两种方式,一种是建立长连接,建立后,不停的发送,接收.另外一种是建立短连接,建立连 ...

  5. loadrunner socket协议问题归纳(2)

    编写步骤 1.建立与服务端的连接 rc=lrs_create_socket(“socket0”,”TCP”,”LocalHost=0”,”RemoteHost=127.0.0.1:8808”,LrsL ...

  6. loadrunner socket协议问题归纳(4)---buffer接收变长和定长的数据

    测试场景:聊天系统 用户登录后,要先向服务器发送用户名,然后可以发送聊天信息,同时也可以接受聊天信息. 如果接受的字符为定长时,可以设定接受长度.recv buf2 66 #include " ...

  7. Loadrunner socket协议lrs_receive函数接收到返回数据包 仍然等待服务器返回--解决

    前段时间在使用loadrunner socket协议发送数据包到到服务器,使用lrs_receive接收服务器应答数据包,已经接收到数据包,但LR仍然在等待服务器端返回,而且日志打印显示每次接收返回都 ...

  8. LoadRunner编写Socket协议脚本方法

    本文主要介绍使用LoadRunner手工编写Windows Socket协议测试脚本的方法. 通过LoadRunner编写Windows Socket协议测试脚本,总体说来,比较简单.就像把大象放进冰 ...

  9. Loadrunner 中socket协议RecvBuffer接收到数据长度为空

    socket通讯,有两种方式,一种是建立长连接(TCP),建立后,不停的发送,接收.另外一种是建立短连接(UDP),建立连接,发送报文,接收响应,关闭连接.两种方式 server的开销不同. 今天出现 ...

随机推荐

  1. android学习:自动识别文本文件编码格式

    /** * 判断文件的编码格式 * @param fileName :file * @return 文件编码格式 * @throws Exception */ public static String ...

  2. 1010 一元多项式求导(用while接收输入)

    题目: 知识点for me: 该题的输入并非是按回车后数据输入完毕也不是给定数据长度,而是输入到文件末尾.可以有以下三种写法: (1)while(cin>>a)  (2)while(sca ...

  3. Ionic3环境搭建及创建

    初次尝试Ionic,边学习边记录下来,以免以后忘记了,入坑向( ̄ω ̄;) 1.Ionic环境安装 Ionic开发是依赖于Nodejs环境的,所以在开发之前我们需要安装好Nodejs.下载安装:http ...

  4. MongoDB模糊查询 工具

    {"Exception":{$regex:"定时发送邮件"}}    //模糊查询条件 {"DateTime":-1}         // ...

  5. linux的用户管理相关配置文件

    Linux的管理命令的本质不过是对配置文件/etc相关文件的修改罢了 

  6. python的___setattr__魔方方法

     ___setattr__魔方方法一定要注意防止无限递归当在此方法内部给属性赋值的时候,那会调用此方法,又会重新赋值,无限重复最后要归于super是种解决方法.或者用dict方法.   class R ...

  7. win下python环境搭建以及安装pip、django

    1. 安装python并配置 下载安装python,这里我下载的是python2.7,听说2.7比较好用 地址:https://www.python.org/downloads/source/ 记住你 ...

  8. 20155302 2016-2017-2 《Java程序设计》第4周总结

    20155302 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 有关类的继承的理解:类实现继承的格式:class 子类名 extends 父类名 类的继承有 ...

  9. 20155338 2016-2017-2 《Java程序设计》第4周学习总结

    20155338 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 内容有很多,这里这是选取几个比较重要的一部分来展示. 1.继承 •定义:继承基本上就是避免多 ...

  10. #333. 【NOIP2017】宝藏

    #333. [NOIP2017]宝藏 http://uoj.ac/problem/333 1.错误的$n^42^n$做法: dp[s]表示当前的点集为s,然后从这些点中选一个做起点i,然后枚举边,然后 ...