在LoadRunner脚本的编写过程中,很多时候我们需要通过服务器返回的响应报文来判断交易的处理情况,比如说服务器返回一个xml报文,用<reponse_code></response>字段的值来指明交易处理的结果,如'0000'表示处理成功,其余取值则表示出错。在基于http协议的脚本中,该值可以通过关联的方式来获取,在这里就不多说了。我在这里说的是另外一种情况,即在一些非http协议脚本(如tuxedo协议)中,如何获取这个值呢?
假设脚本向服务器发送请求的脚本如下:
ret = lrt_tpcall("EAIHINCSMW",(char *)pFml,0,(char **)&recvBuf,&recvlen,0);
服务器处理请求后返回:
<?xml version="1.0" encoding="GBK"?><Transaction><Transaction_Header><tran_response><response_code>2000</response_code><respone_msg>组件处理:组件[SDATA_GetSerialNo]执行失?/respone_msg></tran_response></Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>
以上信息保存在recvBuf中。其中<response_code>字段值'2000'就是我们需要用来判断的字段值,那么在后续的脚本中如何获取该值并做相应的判断呢?
首先声明两个用于取值的字符串指针和一个表示响应码的字符串:
char *response1;
char *response2;
char response_code[5];
接下来是取值的方法:
//判断返回结果是否成功:响应码respone_code '0000'表示处理成功。返回码的其余取值表示出错
response1 = (char *)strstr(recvBuf,"<response_code>");
response1 =response1 + 15;
response2 = (char *)strstr(response1,"</response_code>");
说明:
strstr()函数的作用是:返回一个字符串在另一个字符串中首次出现的位置到后者末尾的子字符串(大小写敏感)。如果这个函数执行成功,将返回剩余字符串(存在相匹配的字符);如果没有找到相匹配的字符,则返回False。
因此strstr(recvBuf,"<response_code>");表示查找在recvBuf中查找<response>字符串,并将其后的字符都赋给response1,故response1的值为:“<response_code>2000</response_code><respone_msg>组件处理:组
件[SDATA_GetSerialNo]执行失?/respone_msg></tran_response></Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>”
response2的值为:</response_code><respone_msg>组件处理:组
件[SDATA_GetSerialNo]执行失?/respone_msg></tran_response><
/Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>
15是“<response_code>”的字符串长度
最后是判断:
if(strncmp(response1,"0000",response2-response1)==0)
{
//返回码0000,处理成功
lr_message("Success!");
}
else
{
//返回码不为0000,处理失败
lr_message("Fail!");
}
说明:
strncmp()函数的作用是:比较字符串的前n个字符(大小写敏感)。返回值:
- 0 – 如果字符串相等
- <0 – 如果string1小于string2
- >0 – 如果string1大于string2
语法:strncmp(string1,string2,length);
如果想打印返回码,则可以用memcpy函数:
memcpy(response_code,response1,4);
lr_error_message("response_code:%s",response_code);
注:以上代码均是从我的实际工作中选取的例子,其中所使用的方法并不一定是最好的解决方案。如果各位同仁有其它更好的方法或建议,请不吝指教!