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

语法:

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

参数说明:

  1. o ParamName: 存放得到的动态内容的参数名称
  2.  
  3. o list of Attributes: 其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写
  4.  
  5. o Notfound: 当在返回信息中找不到要找的内容时应该怎么处理
  6.  
  7. o Notfound=error: 当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值。
  8.  
  9. o Notfound=warning: 当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。
  10.  
  11. o LB( Left Boundary ) : 返回信息的左边界字串。该属性必须有,并且区分大小写。
  12.  
  13. o RB( Right Boundary ): 返回信息的右边界字串。该属性必须有,并且区分大小写。
  14.  
  15. o RelFrameID: 相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。
  16.  
  17. o Search : 返回信息的查找范围。可以是HeadersBodyNoresourceAll(缺省)。该属性质可有可无。
  18.  
  19. o ORD : 说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。
  20.  
  21. o SaveOffset : 当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0
  22.  
  23. o SaveLen :当找到匹配项后,偏移量之后的几个字元存储到参数中。缺省值是-1,表示一直到结尾的整个字串都存入参数。

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

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

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

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

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

  1. web_reg_save_param("orderId",
  2. "LB=",
  3. "RB=",
  4. "ORD=1",
  5. "SaveOffset=1",
  6. "SaveLen=31", //获取运行结果里的orderId "orderId":"9854578067073400832"
  7. "Search=Body",LAST);

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

  1. web_reg_save_param("orderId",
  2. "LB=orderId",
  3. "RB=message",
  4. "ORD=1",
  5. "SaveLen=23",
  6. "Search=Body",LAST);

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

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

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

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

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

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

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

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

  1. Action()
  2. {
  3. /*
    18接口的参数
  4. {"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX",
  5. {"account":"13900001111","posId":"N9NL10255029","couponMoney":0,"couponInfo":"","payMoney":0.01,"barcode":"130122475934385558","channelId":"WX","orderId
  6. 5接口的参数
  7. {"account": 13900001111,"payMoney":0.01}
  8.  
  9. 4接口的参数
  10. {"account": 13900001111}
  11. */
  12.  
  13. //18扫描支付接口的前半部分参数
  14. char * tmpParam = lr_eval_string("{NewParam}");
  15.  
  16. //5创建订单接口的参数
  17. char * tmpParam2 = lr_eval_string("{NewParam_2}");
  18.  
  19. //4获取商户开通支付方式
  20. char * tmpParam3 = lr_eval_string("{NewParam_1}");
  21.  
  22. web_set_proxy("10.16.1.151:180");
  23.  
  24. //设置请求头,没有这个,请求会不认得 web_custom_request该函数的json请求
  25.  
  26. web_add_header("content-type","application/json");
  27.  
  28. lr_save_string(lr_eval_string("{NewParam_1}"),"tmpParam3");
  29.  
  30. web_custom_request("4","URL=http://10.16.1.151:180/getMerchantPayType","Body={tmpParam3}","Method=POST","mode=HTML",LAST);
  31.  
  32. web_add_header("content-type","application/json");
  33. //把5创建订单的参数,获取过来,赋值给tmpParam2
  34.  
  35. lr_save_string(lr_eval_string("{NewParam_2}"),"tmpParam2");//获取5接口返回的参数,指定的参数SaveOffset=31,然后赋值给orderId
  36. /*
  37. web_reg_save_param("orderId",
  38. "LB=",
  39. "RB=",
  40. "ORD=1",
  41. "SaveOffset=1",//获取运行结果里的orderId 45
  42. "SaveLen=31",
  43. "Search=Body",LAST);
  44. */
  45. //获取5接口返回的参数,指定的参数,然后赋值给orderId
  46. web_reg_save_param("orderId",
  47. "LB=orderId",
  48. "RB=message",
  49. "ORD=1",
  50. "SaveLen=23",
  51. "Search=Body",LAST);
  52.  
  53. //5接口创建订单,向服务器请求
  54.  
  55. web_custom_request("5","URL=http://10.16.1.151:180/onlineOrder","Body={tmpParam2}","Method=POST","mode=HTML",LAST);
  56. //返回的参数 {"orderId":"9854578277036064768","message":"创建订单成功","status":100}
  57. //获取5接口返回的参数orderId赋值给orderId
  58.  
  59. lr_save_string(lr_eval_string("{orderId}"),"orderId");
  60.  
  61. //打印获取服务器回复指定的参数
  62.  
  63. lr_output_message(lr_eval_string("{orderId}"));
  64.  
  65. //参数并接,赋值给orderId2,作为18扫描支付接口的参数 会发现这里有2个},参数里面因为少了一个},所以在参数后面补充}
  66.  
  67. lr_save_string(lr_eval_string("{NewParam}{orderId}}"),"orderId2");
  68.  
  69. lr_output_message(lr_eval_string("===========:{orderId2}"));
  70.  
  71. web_add_header("content-type","application/json");
  72.  
  73. //扫描支付接口请求
  74.  
  75. web_custom_request("18","URL=http://10.16.1.151:180/scanPay","Body={orderId2}","Method=POST","mode=HTML",LAST);
  76.  
  77. return 0;
  78. }

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. 【js】 ajax 与 axios 区别

    ajax 与 axios区别 Ajax: Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发 ...

  2. webstorm 常用的快捷键

    1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件.2. ctrl + j: 输出模板3. ctrl + b: 跳到变量申明处4. ctrl + alt + ...

  3. [示例] Firemonkey 面包屑导航

    原码下载:[示例]Firemonkey面包屑导航_Aone.zip 效果:(以下效果不用写一行代码)

  4. 快速认识LinkIt 7697开发板

    LinkIt 7697是一款多功能且价格亲民的开发板,可用来连接网络或你的各项装置,同时提供Wi-Fi及蓝芽两种联机功能.此开发板采用MediaTek MT7697芯片,比起其他类似的Wi-Fi/蓝芽 ...

  5. tensorflow 模型权重导出

    tensorflow在保存权重模型时多使用tf.train.Saver().save 函数进行权重保存,保存的ckpt文件无法直接打开,不利于将模型权重导入到其他框架使用(如Caffe.Keras等) ...

  6. Pytorch之Variable求导机制

    自动求导机制是pytorch中非常重要的性质,免去了手动计算导数,为构建模型节省了时间.下面介绍自动求导机制的基本用法. #自动求导机制 import torch from torch.autogra ...

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

    20155224 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 第六章主要学习了子类与父类的继承. 先定义一个程序,另一程序可继承他 如: publ ...

  8. 20155322 2017-2018-1《信息安全系统设计》第十周 课下作业-IPC

    20155322 2017-2018-1<信息安全系统设计>课下作业-IPC 作业内容 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接. 共享内存 管 ...

  9. Nginx入门篇(一)之Nginx介绍

    1.简介 Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器. Nginx 是由 Igor Sysoe ...

  10. DSP5509项目之用FFT识别钢琴音调(4)之麦克风输入和Line in输入

    1. 麦克风输入需要修改的内容,之前的版本是LINE IN的输入.实现功能,检测麦克风的输入,并且同时在耳机里面播放. #include <csl.h> #include <csl_ ...