在LoadRunner腳本的編寫過程中,很多時候我們需要通過服務(wù)器返回的響應報文來判斷交易的處理情況,比如說服務(wù)器返回一個xml報文,用<reponse_code></response>字段的值來指明交易處理的結(jié)果,如'0000'表示處理成功,其余取值則表示出錯。在基于http協(xié)議的腳本中,該值可以通過關(guān)聯(lián)的方式來獲取,在這里就不多說了。我在這里說的是另外一種情況,即在一些非http協(xié)議腳本(如tuxedo協(xié)議)中,如何獲取這個值呢?
假設(shè)腳本向服務(wù)器發(fā)送請求的腳本如下:
ret = lrt_tpcall("EAIHINCSMW",(char *)pFml,0,(char **)&recvBuf,&recvlen,0);
服務(wù)器處理請求后返回:
<?xml version="1.0" encoding="GBK"?><Transaction><Transaction_Header><tran_response><response_code>2000</response_code><respone_msg>組件處理:組件[SDATA_GetSerialNo]執(zhí)行失?/respone_msg></tran_response></Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>
以上信息保存在recvBuf中。其中<response_code>字段值'2000'就是我們需要用來判斷的字段值,那么在后續(xù)的腳本中如何獲取該值并做相應的判斷呢?
首先聲明兩個用于取值的字符串指針和一個表示響應碼的字符串:
char *response1;
char *response2;
char response_code[5];
接下來是取值的方法:
//判斷返回結(jié)果是否成功:響應碼respone_code '0000'表示處理成功。返回碼的其余取值表示出錯
response1 = (char *)strstr(recvBuf,"<response_code>");
response1 =response1 + 15;
response2 = (char *)strstr(response1,"</response_code>");
說明:
strstr()函數(shù)的作用是:返回一個字符串在另一個字符串中首次出現(xiàn)的位置到后者末尾的子字符串(大小寫敏感)。如果這個函數(shù)執(zhí)行成功,將返回剩余字符串(存在相匹配的字符);如果沒有找到相匹配的字符,則返回False。
因此strstr(recvBuf,"<response_code>");表示查找在recvBuf中查找<response>字符串,并將其后的字符都賦給response1,故response1的值為:“<response_code>2000</response_code><respone_msg>組件處理:組 件[SDATA_GetSerialNo]執(zhí)行失?/respone_msg></tran_response></Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>”
response2的值為:</response_code><respone_msg>組件處理:組 件[SDATA_GetSerialNo]執(zhí)行失?/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()函數(shù)的作用是:比較字符串的前n個字符(大小寫敏感)。返回值:
如果想打印返回碼,則可以用memcpy函數(shù):
memcpy(response_code,response1,4);
lr_error_message("response_code:%s",response_code);
注:以上代碼均是從我的實際工作中選取的例子,其中所使用的方法并不一定是最好的解決方案。如果各位同仁有其它更好的方法或建議,請不吝指教!
假設(shè)腳本向服務(wù)器發(fā)送請求的腳本如下:
ret = lrt_tpcall("EAIHINCSMW",(char *)pFml,0,(char **)&recvBuf,&recvlen,0);
服務(wù)器處理請求后返回:
<?xml version="1.0" encoding="GBK"?><Transaction><Transaction_Header><tran_response><response_code>2000</response_code><respone_msg>組件處理:組件[SDATA_GetSerialNo]執(zhí)行失?/respone_msg></tran_response></Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>
以上信息保存在recvBuf中。其中<response_code>字段值'2000'就是我們需要用來判斷的字段值,那么在后續(xù)的腳本中如何獲取該值并做相應的判斷呢?
首先聲明兩個用于取值的字符串指針和一個表示響應碼的字符串:
char *response1;
char *response2;
char response_code[5];
接下來是取值的方法:
//判斷返回結(jié)果是否成功:響應碼respone_code '0000'表示處理成功。返回碼的其余取值表示出錯
response1 = (char *)strstr(recvBuf,"<response_code>");
response1 =response1 + 15;
response2 = (char *)strstr(response1,"</response_code>");
說明:
strstr()函數(shù)的作用是:返回一個字符串在另一個字符串中首次出現(xiàn)的位置到后者末尾的子字符串(大小寫敏感)。如果這個函數(shù)執(zhí)行成功,將返回剩余字符串(存在相匹配的字符);如果沒有找到相匹配的字符,則返回False。
因此strstr(recvBuf,"<response_code>");表示查找在recvBuf中查找<response>字符串,并將其后的字符都賦給response1,故response1的值為:“<response_code>2000</response_code><respone_msg>組件處理:組 件[SDATA_GetSerialNo]執(zhí)行失?/respone_msg></tran_response></Transaction_Header><Transaction_Body><response/>
</Transaction_Body></Transaction>”
response2的值為:</response_code><respone_msg>組件處理:組 件[SDATA_GetSerialNo]執(zhí)行失?/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()函數(shù)的作用是:比較字符串的前n個字符(大小寫敏感)。返回值:
- 0 – 如果字符串相等
- <0 – 如果string1小于string2
- >0 – 如果string1大于string2
如果想打印返回碼,則可以用memcpy函數(shù):
memcpy(response_code,response1,4);
lr_error_message("response_code:%s",response_code);
注:以上代碼均是從我的實際工作中選取的例子,其中所使用的方法并不一定是最好的解決方案。如果各位同仁有其它更好的方法或建議,請不吝指教!
另外,在非http協(xié)議腳本中,是否不能用lrs_save_searched_string函數(shù)?
我沒有用過你說的這個函數(shù),所以不確定是不是可以在非http協(xié)議腳本使用,有機會可以在QQ或MSN上和我討論一下。
在tuxedo中也有相應的函數(shù),如:lrt_save_parm 、lrt_save_searched_string和lrt_save_searched_string_ext。
因為前面xingcyx說了,可以用關(guān)聯(lián),而這里他用的是另一種處理方式。
呵呵,繞了一圈實現(xiàn)了關(guān)聯(lián)的功能,也算是練練手了。