查看完整版本: 使用自定义请求向服务器发送请求的方法

xingcyx 2007-10-23 14:10

使用自定义请求向服务器发送请求的方法

在LR中,web_submit_data中字符串的拼接有个问题,就是不能使用C中的字符串类型去直接替换,就算使用了lr_save_string函数,仍然可能会存在问题,以下举例说明。

     脚本背景如下:

     web_submit_data(classicustomermaterial_significanteventinfo.jsf")返回的页面上可能存在多条记录,同时记录数不确定,因此需要设定一个循环,来重复关联,并执行后续的操作,如:

     web_submit_data("creditReviewClassiLoanMaterial.jsf",            

     ITEMDATA,

    [b] "Name=body:frm2:classiAssetsVOTable_0:check", "Value=true", ENDITEM,

     "Name=body:frm2:classiAssetsVOTable_1:check", "Value=true", ENDITEM,[/b]

     "Name=body:frm2:_id148", "Value=填写债项级分类信息", ENDITEM,
     "Name=body:frm2_SUBMIT", "Value=1", ENDITEM,
     "Name=autoScroll", "Value=0,102", ENDITEM,
     "Name=body:frm2:_link_hidden_", "Value=", ENDITEM,

     LAST);

    假定黑体部分的脚本classiAssetsVOTable_0:check、classiAssetsVOTable_1:check是需要循环进行关联的。如果有实际操作过的朋友就不难发现,0、1这些数字很难在函数中用变量替换。这个时候有一个简便的方法,就是使用LR中提供的自定义请求函数来向服务器提交请求,即使用web_custom_request函数。该函数的使用方法很简单,最主要的是在Body部分把ITEMDATA之后的“Name”和“Value”通过{Name}={Value}的形式组合起来,并且在多组值之间用“&”分隔。如:

     web_custom_request("creditReviewClassiLoanMaterial.jsf",

       "Method=POST",

       "RecContentType=text/html",

       "Snapshot=t19.inf",

       "Mode=HTML",   

      [b] "Body=body:frm2:classiAssetsVOTable_1:check=true&

       body:frm2:classiAssetsVOTable_%2:check=true&

       body:frm2:_id148=填写债项级分类信息&      

       body:frm2_SUBMIT=1&

       autoScroll=0,102&

       body:frm2:_link_hidden_="
[/b]
       LAST);  

    关于该函数更详细的信息可以参考LR的帮助文档。

    回放脚本,成功!通过执行结果我们可以看到,使用web_custom_request向服务器发送请求和使用web_submit_data发送请求起到的效果是完全一样的。不过看到这里,可能大家会有一个疑问:为什么要使用自定义请求报文来代替原有的web_submit_data呢?用原来的这个不是好好的吗?主要是因为在有些时候,我们需要使用自定义的字符串来对脚本进行一些特殊处理,例如在本例中,我们就遇到了这样的问题。由于我们需要将

  [b]  "Name=body:frm2:classiAssetsVOTable_0:check", "Value=true", ENDITEM,

    "Name=body:frm2:classiAssetsVOTable_1:check", "Value=true", ENDITEM,[/b]

这部分脚本放进循环体中,因此我们希望可以通过字符串拼接的方式,组装出这一整串字符,放进请求函数中,而在web_submit_data中很难达到这样看似简单的目的(我一直觉得应该还是有办法的,但我试了很久一直不成功。),所以只好另找出路。

     以下是脚本的示例:

1、  利用字符串操作函数组装所需的字符串

strcpy(str,"BODY=");              

       for(i=0;i<count;i++)

       {

              sprintf(tmp,"body:frm2:classiAssetsVOTable_%d:check=true&",i);

              strcat(str, tmp);

       }

       strcat(str,"body:frm2:_id148=填写债项级分类信息&body:frm2_SUBMIT=1&autoScroll=0,102&body:frm2:_link_hidden_=");

2、  在自定义请求函数中使用组装好的字符串。

               web_custom_request("creditReviewClassiLoanMaterial.jsf",

                                            "URL={url}",

                                            "Method=POST",

                                            "RecContentType=text/html",

                                            "Referer={url}",

                                            "Snapshot=t19.inf",

"Mode=HTML",

                                                [b] str,[/b]

                                                 LAST);

[[i] 本帖最后由 xingcyx 于 2007-10-23 15:15 编辑 [/i]]

Zee 2007-10-23 14:13

导演,这次,我真心的顶你。::hug:

xingcyx 2007-10-23 14:18

:lol :loveliness:

这么说难道你以前都不是真心的?:Q :(

qiguojie 2007-10-23 15:07

顶,难道就是传说中的导演。。。。

xingcyx 2007-10-23 15:14

[quote]原帖由 [i]qiguojie[/i] 于 2007-10-23 15:07 发表 [url=http://bbs.51testing.com/redirect.php?goto=findpost&pid=763638&ptid=94357][img]http://bbs.51testing.com/images/common/back.gif[/img][/url]
顶,难道就是传说中的导演。。。。 [/quote]

是我呀。。
导演是我在QQ上的昵称。。。

不过,我什么时候成传说中的了,虚荣心得到了极大的满足,开心。。。:loveliness: :lol

guochuanyu 2007-10-23 15:35

哈哈哈,不错,这次回帖不是为了赚分.

abgg 2007-10-24 16:37

好像有点深哦,看不大懂!!!
]不过谢谢了

ggogw 2007-10-29 16:04

长见识了!

阳光_测试 2007-10-30 10:11

导演支持你

写的不错
你说的“在LR中,web_submit_data中字符串的拼接有个问题,就是不能使用C中的字符串类型去直接替换,就算使用了lr_save_string函数,仍然可能会存在问题,”这个“有问题”是什么意思,是能实现,还是实现不了??
我原来在一个实验中web_submit_data()中也可以实现for循环的替换??

xingcyx 2007-10-30 15:14

有问题就是我不确定在web_submit_data()是否也同样能够实现?
因为我之前也直接在web_submit_data()里实现过,但这次却不行了。
其实最主要的问题是在拼接的时候,web_submit_data()不能识别ENDITEM这个结束符,所以没有办法把这当成字符串的一部分拼接进去。
你有时间可以再做做实验看看,如果你发现了用web_submit_data()可以实现的方法,再来和我讨论吧。:victory:

pupu840323 2007-11-6 15:21

虽然还没有看到这么深奥的东西(目前),但ZEE都说好了,就一定要仔细研究

pupu840323 2007-11-6 15:40

细看了一遍,看懂了,但是没有在工作中用到过类似的东西,所以无法亲自动手去实践,到用的时候再说吧,现在脑子里有个印象

meiliqingdao 2007-11-12 18:10

我到是知道,用web_custom_request替代web_submit_data. 也是别人告诉我的,但是没搞懂,为什么要用web_custom_request替代web_submit_data.

xingcyx 2007-11-13 10:57

[quote]原帖由 [i]meiliqingdao[/i] 于 2007-11-12 18:10 发表 [url=http://bbs.51testing.com/redirect.php?goto=findpost&pid=785323&ptid=94357][img]http://bbs.51testing.com/images/common/back.gif[/img][/url]
我到是知道,用web_custom_request替代web_submit_data. 也是别人告诉我的,但是没搞懂,为什么要用web_custom_request替代web_submit_data. [/quote]

可能大家会有一个疑问:为什么要使用自定义请求报文来代替原有的web_submit_data呢?用原来的这个不是好好的吗?主要是因为在有些时候,我们需要使用自定义的字符串来对脚本进行一些特殊处理,例如在本例中,我们就遇到了这样的问题。由于我们需要将

    "Name=body:frm2:classiAssetsVOTable_0:check", "Value=true", ENDITEM,

    "Name=body:frm2:classiAssetsVOTable_1:check", "Value=true", ENDITEM,

这部分脚本放进循环体中,因此我们希望可以通过字符串拼接的方式,组装出这一整串字符,放进请求函数中,而在web_submit_data中很难达到这样看似简单的目的

tangnajing2005 2007-11-13 17:33

:)

小老虎菲菲 2007-11-16 15:02

饿,看了遍,研究了遍,还是二丈和尚一个,看到差距了,我要继续努力啊

skydjp 2007-12-18 22:22

memory violation

我自定义请求后,运行脚本是经常出现内存非法访问,
C interpreter run time error :Action(46):Error --memory violation:Exception ACCESS_VIOLATION received.
Abnormail termination, caused by mdrv process termination.
脚本如下:
int len;
char *temp;
srand((int)time(0));
len = (int)(rand() % 1024) + 1;
if ((temp = (char *)malloc(len * sizeof(char))) == NULL){
      return 0;
}
else {
      memset(temp,'b',len * sizeof(char));
      memcpy(temp,"BODY=file=",10);
}
web_custom_request("fram.php",
          "URL=http://192.168.0.23/fram.php",
          "Method=POST",
          "RecContentType=text/html",
          "Referer=http://192.168.0.23/fram.php",
          "Mode=HTML",
          temp,
          LAST);
free(temp);
请各位达人帮忙看是什么问题,运行的时候是采用多线程.出现错误的时间是过几分钟后才出现,不是一开始跑就出现.有人碰到过类似的问题吗?

[[i] 本帖最后由 skydjp 于 2007-12-18 22:48 编辑 [/i]]

xingcyx 2007-12-19 11:04

呃……楼上说的是一个典型的内存泄露问题吧。
可能是你申请的内存没有被及时释放,至于什么原因,说起来问题就大了,希望高手们能引申出来讨论。
:lol

skydjp 2007-12-19 11:44

我在action最前分配置内存,在做完web_custom_request请求后我已经把内存给释放了free(temp),在报错的时候总是说我的web_custom_request这个请求函数非法访问内存了.我后来试了用多进种方式去跑也是同样的情况,但我在回放记录的时候不会出错.高手们能分析一下是什么原因吗?

skydjp 2007-12-19 20:23

多谢,xingcyx
问题解决了
:)

thloong 2007-12-20 09:53

你在打太极啊?确实是好贴,顶

xingcyx 2007-12-20 12:41

[quote]原帖由 [i]skydjp[/i] 于 2007-12-19 20:23 发表 [url=http://bbs.51testing.com/redirect.php?goto=findpost&pid=825086&ptid=94357][img]http://bbs.51testing.com/images/common/back.gif[/img][/url]
多谢,xingcyx
问题解决了
:) [/quote]

解决了,那就把问题的原因和解决的方法拿出来共享一下吧。

ZH_0211 2007-12-21 12:06

先下DOWN下来,慢慢研究

skydjp 2007-12-21 22:07

主要问题是在于内存初始的问题和字符串的最后结束符上,正确的代码如下:
int len;
char *temp;
srand((int)time(0));
len = (int)(rand() % 1024) + 11;
if ((temp = (char *)malloc(len * sizeof(char))) == NULL){
      return 0;
}
else {
      memset(temp,'\0',len * sizeof(char));
      memset(temp,'b',len * sizeof(char) - 1);
      memcpy(temp,"BODY=file=",10);
}
web_custom_request("fram.php",
          "URL=http://192.168.0.23/fram.php",
          "Method=POST",
          "RecContentType=text/html",
          "Referer=http://192.168.0.23/fram.php",
          "Mode=HTML",
          temp,
          LAST);
free(temp);
这样就可以向服务器发送小1K的随机文件.

[[i] 本帖最后由 skydjp 于 2007-12-22 10:34 编辑 [/i]]

thunder1213 2007-12-24 11:01

回复 1# 的帖子

学习中。。。。

stone0214 2007-12-24 14:06

好东西,顶了

msnshow 2007-12-29 15:52

虽然没看懂,但还是顶一下!

54111 2008-1-2 12:16

暂时没遇到这种问题,学习下先

salent 2008-1-5 15:40

发现高手还是很多的,好好学习:victory:
页: [1]
查看完整版本: 使用自定义请求向服务器发送请求的方法