web_custom_request 自定义请求浅析

LoadRunner提供的web_custom_request函数可以用于实现参数的动态生成。在LoadRunner中,web_reg_save_param和custom_request都常于处理参数的动态生成。

web_reg_save_param函数是大家都已经熟悉的了,它的主要作用是从一个response中获得后续的request需要使用的数据,然后将其作为一个参数保存下来,供后续步骤使用。该方法在LoadRunner中被称为Correlation(关联)。

而web_custom_request函数则可以用于完全自定义向服务端发送的request。

接下来我们用一个实际的例子说明一下web_custom_request的具体应用:

以Mercury自带的MercuryWebTours例子为例,假设我们希望在登录进入后将用户的前两条记录删除,我们来看看用web_custom_request如何实现这个目标。

首先,我们尝试用HTML方式对该操作进行录制。录制后的脚本中与删除相关的部分大致如下:

web_url("welcome.pl",
    "URL=http://localhost/MercuryWebTours/welcome.pl?page=itinerary",
     "Resource=0",
     "RecContentType=text/html",
     "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=home",
     "Snapshot=t3.inf",
     "Mode=HTML",
     EXTRARES,
     "URL=images/in_itinerary.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
     "URL=images/home.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
     LAST);
lr_think_time(2);

web_submit_form("itinerary.pl",
    "Snapshot=t4.inf",
    ITEMDATA,
    "Name=1", "Value=on", ENDITEM,
    "Name=2", "Value=on", ENDITEM,        "Name=removeFlights.x", "Value=116", ENDITEM,
    "Name=removeFlights.y", "Value=8", ENDITEM,
    LAST);

通过树形模式查看一下在submit form的时候实际向服务器发出的请求的内容:

从请求内容中可以看到,我们通过POST方法发出了请求,请求发送的目的URL是/MercuryWebTours/itinerary.pl,发送的内容是:
"1=on&flightID=384-798-JM&2=on&flightID=3026-1592-JM&3=on&flightID=1194-2326-JM&.cgifields=1&.c"
"gifields=2&.cgifields=3&removeFlights.x=116&removeFlights.y=8"

从发送的内容中可以很明显的分析得出,1=on表示第一个checkbox是被选中的,flightID=384-798-JM表示的是第一条记录所对应的flightID。因此,如果我们需要自己组成这个发送的request的话,必须首先通过关联的方式获得前两条记录的flightID,然后再组成request的内容。

web_custom_request方法的原型是:
int web_custom_request (const char *RequestName, <List of Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );

其中List of Attributes的主要项目是Method,URL和BODY等。对这个例子来说,我们可以很容易构造出我们需要的request的BODY内容。
……
 strcpy(creq, "Body=1=on&flightID=");
 strcat(creq, lr_eval_string("{fID1}"));
 strcat(creq, "&2=on&flightID=");
 strcat(creq, lr_eval_string("{fID2}"));
 strcat(creq, "&.cgifields=1&.cgifields=2");
 strcat(creq, "&removeFlights.x=116&removeFlights.y=8");
……

其中{fID1}、{fID2}等都是通过关联获得的flightID的数据。

因此,我们可以根据图中的数据编写custom_request语句:

web_custom_request("itinerary.pl",
    "Method=POST",
    "URL=http://localhost/MercuryWebTours/itinerary.pl",
    "RecContentType=text/xml",
    creq,
    "Snapshot=t4.inf",
    LAST);

较为完整的代码如下:

Action()
{
    char creq[500];

    web_reg_save_param("fID1", "LB=INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"", "RB=\"", "ORD=1",
        "SEARCH=BODY", LAST);
    web_reg_save_param("fID2", "LB=INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"", "RB=\"", "ORD=2",
        "SEARCH=BODY", LAST);
    web_url("welcome.pl",
        "URL=http://localhost/MercuryWebTours/welcome.pl?page=itinerary",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=home",
        "Snapshot=t3.inf",
        "Mode=HTML",
        EXTRARES,
        "URL=images/in_itinerary.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
        "URL=images/home.gif", "Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary", ENDITEM,
        LAST);
    lr_think_time(2);

    strcpy(creq, "Body=1=on&flightID=");
    strcat(creq, lr_eval_string("{fID1}"));
    strcat(creq, "&2=on&flightID=");
    strcat(creq, lr_eval_string("{fID2}"));
    strcat(creq, "&.cgifields=1&.cgifields=2");
    strcat(creq, "&removeFlights.x=116&removeFlights.y=8");

    lr_output_message(creq);

    web_custom_request("itinerary.pl",
"Method=POST",
        "URL=http://localhost/MercuryWebTours/itinerary.pl",
        "RecContentType=text/xml",
        creq,
        "Snapshot=t4.inf",
        LAST);

    return 0;
}
时间: 2024-11-11 22:50:25

web_custom_request 自定义请求浅析的相关文章

背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(WebView) 加载指定 HttpMethod 的请求 自定义请求的 http header app 与 js 的交互 示例1.演示 WebView 如何加载指定 HttpMethod 的请求以及如何自定义请求的 http headerWebApi/Controllers/WebViewPostController.cs /* * 用于 WebView 演示“如何加载指定 HttpMethod 的请求,以及如何自

【Android - 进阶】之自定义视图浅析

1       概述 Android自定义View / ViewGroup的步骤大致如下: 1) 自定义属性: 2) 选择和设置构造方法: 3) 重写onMeasure()方法: 4) 重写onDraw()方法: 5) 重写onLayout()方法: 6) 重写其他事件的方法(滑动监听等). 2       自定义属性 Android自定义属性主要有定义.使用和获取三个步骤. 2.1    定义自定义属性 参考:http://blog.csdn.net/lmj623565791/article/

php curl如何设置自定义请求头和打印请求头信息

$header = [ 'client:h5', 'token:test', ]; curlRequest($url, $params, true, 10, $header); PHP 5.1.3版以上支持用curl_getinfo函数来获取请求头具体需要先设置 curl_setopt($ch, CURLINFO_HEADER_OUT, true);然后在请求发生后用 curl_getinfo($ch, CURLINFO_HEADER_OUT); function curlRequest($ur

ajax设置自定义请求头信息

客户端请求 $.ajax({ type:"post", url:urlstr, dataType:'json', async:true, headers:{token:'abck'}, success:function (data) { console.log(data.info); console.log(JSON.stringify(data)); }, error:function (xhr,text) { alert(text); } }); 服务端代码 public func

ajax用beforeSend自定义请求过程中客户端事件,提高用户体验

本文为博主原创,未经允许不得转载: 在应用ajax的过程中,当我们再前台提交请求的时候,如果服务端响应事件比较长,就会导致需要等很长时间在前台才能接受到服务端返回的 响应结果,往往会导致用户重复点击按钮,进行重复请求,如何可以避免这种情况发生,ajax提供了一个beforeSend属性,用这个既可以避免这种 情况发生. 用这个属性可以定义客户端向服务端请求过程中的事件,比如在请求过程中禁用请求按钮的属性,或定义请求加载状态等, 实现的代码如下: function exportData(){ $.

C#API解决自定义请求头下的跨域问题

解决方法一: public class CrosHandler : DelegatingHandler { private const string Origin = "Origin"; private const string AccessControlRequestMethod = "Access-Control-Request-Method"; private const string AccessControlRequestHeaders = "A

element-ui 表单验证 发送自定义请求

目前我的方法    发送请求的表单验证! 原文地址:https://www.cnblogs.com/wxqworld/p/11196316.html

ajax设置自定义请求头

1, $.ajax({ url:apiUrl, type:"get", timeout : 5000, //超时时间设置,单位毫秒 dataType: "json", beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Bearer "+obj.data); xhr.setRequestHeader("Accept", &qu

LoadRunner 7 脚本开发和常用函数

开发性能测试脚本原则.简单 正确 高效 在lr中,脚本运行是解释执行的.所以在运行时,需要先编译. 局部变量和全局变量 1.在init.action.end中定义的变量就是局部变量 2.在globals.h中定义的变量是全局变量 3.什么时候定义全局变量 ? 整个过程中固定不变的,例如URL地址.KEY.其他 int a=100;//这个a是文件级别的.除了globals.h 都可访问 Action() { int a =10; int b =6; //在lr要使用变量,必须放在最上面. pri