在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);

    注:以上代碼均是從我的實際工作中選取的例子,其中所使用的方法并不一定是最好的解決方案。如果各位同仁有其它更好的方法或建議,請不吝指教!