LoadRunner(三)再識web_custom_request函式

ryu2003發表於2016-07-12

web_custom_request函式在LR中使用非常普遍,特別是在手工指令碼替代錄制指令碼的今天,幾乎所有的請求都使用此函式來完成。
從理論上講,該函式屬於萬能函式,完全可以替代web_link()、web_url()、web_submit_data()這些函式的存在。
事情是這樣的:昨天在對某一介面進行指令碼編寫的時候,發現一個很奇怪的情況,該介面呼叫方式為:http://xxxxxxx/xx/xx?data=“json資料”的方式來進行;最初的想法是直接在web_custom_request函式的URL引數中拼接json資料,這種方式在最初的幾條資料的情況下是可以完美的實現的,如下程式碼:

        web_custom_request("web_custom_request",
                         "URL={URL}
                         "Method=POST",
                         .....
                          LAST);

但是專案要求JSON資料至少需要上百條,這上百條資料拼接起來長度直接上2000位元組,此時LR回放直接報錯:

Action.c(44): 錯誤 -26631: 對於“http://......”,HTTP 狀態程式碼=400 (Bad Request)      [MsgId: MERR-26631]
Action.c(44): web_custom_request("web_custom_request") 最高嚴重級別為“ERROR”,324 個正文位元組,179 個標頭位元組   [MsgId: MMSG-26388]
Action.c(44): 錯誤 -27748: 生成 HTTP 請求時,緩衝區溢位。嘗試增加執行時設定中的“網路緩衝區大小”。    [MsgId: MERR-27748]

之類的錯誤層出不窮,然後想到既然如此,為何不把內容寫入Body中,這樣傳送的時候會自動分片,於是有了如下的寫法:

        web_custom_request("web_custom_request",
                         "URL=http://192.168.51.123:81/dc-api/action",
                         "Method=POST",
                         "Resource=0",
                         "RecContentType=text/html",
                         "Referer=",
                         "Snapshot=t2.inf",
                         "Mode=HTML",
                         "EncType=text/html",
                         "Body=data={param}",
                          LAST);

執行後是不報錯了,但是介面部分返回缺提示:

{"Result":false,"Message":"傳入data為空","Code":"ERR-0x00000095","Version":"","Data":null}

這就奇怪了,然後修改了各種方法,都不行,最後進行了如下修改:

        web_custom_request("web_custom_request",
                         "URL=http://192.168.51.123:81/dc-api/action",
                         "Method=POST",
                         "Resource=0",
                         "RecContentType=text/html",
                         "Referer=",
                         "Snapshot=t2.inf",
                         "Mode=HTML",
                         "EncType=application/x-www-form-urlencoded", 
                         "Body=data={param}",
                          LAST);

即指定了EncType為application/x-www-form-urlencoded的方式,介面提示成功了。

通過研究後發現,web_custom_request的EncType編碼型別。此引數給出一個內容型別(Content-Type),指定其做為回放指令碼時“Content-Type”請求頭的值,例如“text/html”。Web_custom_request函式不處理未編碼的請求體。請求體引數將會使用已經指定的編碼方式。因此,如果指定了不匹配HTTP請求體的“EncType”,會引發服務端的錯誤。通常我們建議不要手動修改錄製時的“EncType”值。
任何對於“EncType”的指定都會覆蓋web_add_[auto_]header函式指定的Content-Type。當指定了“EncType=”(空值)時,不會產生“Content-Type” 請求頭。當省略了“EncType”時,任何一個web_add_[auto_]header函式都會起作用。如果既沒有指定EncType也沒有web_add_[auto_]header函且“Method=POST”,
“application/x-www-form-urlencoded”會做為預設值來使用。其他情況下,不會產生Content-Type請求頭。

在後面分析的時候,也是通過抓包方式發現了確實兩種不同編碼方式有不同的請求頭,而不同的頭在介面方向接收的時候處理會出現異常。

相關文章