web_custom_request函数之Body详解

1. Body:

  一般情况下Body中内容是作为字面值进行发送的,Body中也可以发送二进制流(用十六进制表示),方法如下,但仅限二进制流中不含空字符\x00,如果一段Body的二进制流中有空字符,则web_custom_request实际发送的内容为第一个空字符之前的数据,其后的数据(包括空)都会被截断。

例如:

1.1 Body内容不含空字符\x00

复制代码
1 web_custom_request("web_custom_request",
2 "URL=http://www.baidu.com",
3 "Method=POST",
4 "TargetFrame=",
5 "Resource=0",
6 "Referer=",
7 "Mode=HTTP",
8 "Body=\x3d\x9d\x1d\xef\xa4\x04\x41",
9 LAST);
复制代码

发送数据包的Body内容为:

 

1.2 Body内容含空字符\x00

复制代码
1 web_custom_request("web_custom_request",
2 "URL=http://www.baidu.com",
3 "Method=POST",
4 "TargetFrame=",
5 "Resource=0",
6 "Referer=",
7 "Mode=HTTP",
8 "Body=\x3d\x00\x9d\x1d\xef\xa4\x00\x04\x41",
9 LAST); 
复制代码

 

 发送数据包的Body内容为:

  因此使用Body是无法发送含有空的二进制数据流的,此外,Body中的内容可以使用参数替代,web_custom_request函数的整个Body字符串参数("Body=abcd")也是可以使用一个变量(数组或字符指针)来替代的,注意点:1、变量中的内容不需要含有双引号,例如:char BodyVar[20] = "Body=abcd"; 2、使用变量时后面加一个逗号,例如:BodyVar, 。

 

2. BodyBinary:

  当要发送的二进制数据流中含有空时可以使用BodyBinary来发送,注意下面的代码,发送的请求中第一个空之后的数据仍然被截断, 发送数据包的Body内容同1.2中的截图:

复制代码
1 web_custom_request("web_custom_request",
2 "URL=http://www.baidu.com",
3 "Method=POST",
4 "TargetFrame=",
5 "Resource=0",
6 "Referer=",
7 "Mode=HTTP",
8 "BodyBinary=\x3d\x00\x9d\x1d\xef\xa4\x00\x04\x41\x00\x00\x42",
9 LAST);
复制代码

 

正确的写法如下,使用两个转义字符:

复制代码
1 web_custom_request("web_custom_request",
2 "URL=http://www.baidu.com",
3 "Method=POST",
4 "TargetFrame=",
5 "Resource=0",
6 "Referer=",
7 "Mode=HTTP",
8 "BodyBinary=\\x3d\\x00\\x9d\\x1d\\xef\\xa4\\x00\\x04\\x41\\x00\\x00\\x42",
9 LAST);
复制代码

 

也可以如下这样写,只在出现空的地方用两个反斜杠:

复制代码
1 web_custom_request("web_custom_request",
2 "URL=http://www.baidu.com",
3 "Method=POST",
4 "TargetFrame=",
5 "Resource=0",
6 "Referer=",
7 "Mode=HTTP",
8 "BodyBinary=\x3d\\x00\x9d\x1d\xef\xa4\\x00\x04\x41\\x00\\x00\x42",
9 LAST);
复制代码

 

 发送数据包的Body内容为:

  即二进制数据流中含有空也是可以发送的,上面一栏显示的是八进制表示。BodyBinary中的内容同样可以使用参数替代,整个BodyBinary字符串参数同样可以使用变量替换。如下:

复制代码
 1 char *sendbufhex = "\\x3d\\x00\\x9d\\x1d\\xef\\xa4\\x00\\x04\\x41\\x00\\x00\\x42";
 2 lr_save_string(sendbufhex,"sendbufhexParam");
 3 
 4 web_custom_request("web_custom_request",
 5 "URL=http://www.baidu.com",
 6 "Method=POST",
 7 "TargetFrame=",
 8 "Resource=0",
 9 "Referer=",
10 "Mode=HTTP",
11 "BodyBinary={sendbufhexParam}",
12 LAST);
复制代码

 

复制代码
 1 char *sendbufhexBody = "BodyBinary=\\x3d\\x00\\x9d\\x1d\\xef\\xa4\\x00\\x04\\x41\\x00\\x00\\x42";
 2 
 3 
 4 web_custom_request("web_custom_request",
 5 "URL=http://www.baidu.com",
 6 "Method=POST",
 7 "TargetFrame=",
 8 "Resource=0",
 9 "Referer=",
10 "Mode=HTTP",
11 sendbufhexBody,
12 LAST);
复制代码

 

  但是当参数或变量中的内容并不是上面这样直接赋值一个常量字符串,而是通过其他拆分拼接而来时,就只需要使用一个反斜杆,比如:我要发送的的一串二进制流的十六进制字符串为:3d009d1defa4000441000042,参数写法代码如下:

复制代码
 1 char sendbuf[100] ="3d009d1defa4000441000042";
 2 char sendbufhex[100];
 3 char temp[100];
 4 int sendbuflen,i;
 5 
 6 sendbuflen = strlen(sendbuf);
 7 memset(sendbufhex,'\0',sizeof(sendbufhex));
 8 
 9 for(i=0;i<sendbuflen;i+=2)
10 {
11         memset(temp,'\0',sizeof(temp));
12         temp[0] = '\\';
13     temp[1] = 'x';
14     temp[2] = sendbuf[i];
15     temp[3] = sendbuf[i+1];
16     lr_output_message("Notify:temp:%s",temp);
17     strcat(sendbufhex,temp);
18 }
19 
20 lr_output_message("Notify:sendbufhex:%s",sendbufhex);
21 
22 lr_save_string(sendbufhex,"sendbufhexParam");
23 
24 lr_output_message("Notify:sendbufhexParam:%s",lr_eval_string("{sendbufhexParam}"));
25 
26 web_custom_request("web_custom_request",
27 "URL=http://www.baidu.com",
28 "Method=POST",
29 "TargetFrame=",
30 "Resource=0",
31 "Referer=",
32 "Mode=HTTP",
33 "BodyBinary={sendbufhexParam}",
34 LAST);    
复制代码

 

特别注意:拼接的参数中只需要一个饭斜杠而不是两个饭斜杠,”3d009d1defa4000441000042"  ==》 "\x3d\x00\x9d\x1d\xef\xa4\x00\x04\x41\x00\x00\x42"

变量替换写法代码如下:

复制代码
 1 char sendbuf[100] ="3d009d1defa4000441000042";
 2 char sendbufhex[100];
 3 char temp[100];
 4 int sendbuflen,i;
 5 sendbuflen = strlen(sendbuf);
 6 lr_output_message("Notify:sendbuflen:%d",sendbuflen);
 7 
 8 memset(sendbufhex,'\0',sizeof(sendbufhex));
 9 strcat(sendbufhex,"BodyBinary=");
10 
11 for(i=0;i<sendbuflen;i+=2)
12 {
13     memset(temp,'\0',sizeof(temp));
14     temp[0] = '\\';
15     temp[1] = 'x';
16     temp[2] = sendbuf[i];
17     temp[3] = sendbuf[i+1]    ;
18     lr_output_message("Notify:temp:%s",temp);
19     strcat(sendbufhex,temp);
20 }
21 
22 lr_output_message("Notify:sendbufhex:%s",sendbufhex);
23 
24 web_custom_request("web_custom_request",
25 "URL=http://www.baidu.com",
26 "Method=POST",
27 "TargetFrame=",
28 "Resource=0",
29 "Referer=",
30 "Mode=HTTP",
31 sendbufhex,
32 LAST);
复制代码

 

3. RAW_BODY

  待续...

  可用于发送json格式的数据:

复制代码
 1 web_custom_request("request",   //随便写个名字
 2 "Method=POST",                         //请求的方法
 3 "URL=http://www.baidu.com",        //请求地址
 4 "RecContentType=application/json",    //指定相应头的Content-Type,这里是JSON
 5 "EncType=application/json",               //指定请求头的Content-Type,这里也是JSON
 6 "Mode=HTML",
 7 RAW_BODY_START,                      //请求BODY开始的标识符
 8 "{\"userIds\":[1300000001,1300002029,1300003163],\"type\":0}",  //BODY的内容
 9 55,                                    //上面一行BODY内容的长度
10 RAW_BODY_END,                  //请求BODY结束的标识符
11 LAST);
复制代码

  实际发送的数据内容为:

原文出处:http://www.cnblogs.com/yezhaohui/p/3280239.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值