LoadRunner(三)再識web_custom_request函數

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請求頭。

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

發佈了52 篇原創文章 · 獲贊 47 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章