Postman的Pre-request Script自動計算簽名方案

一、基本介紹

在Postman中趴梢,Pre-request Script是一個功能強大的特性噩峦,它允許你在發(fā)送請求之前執(zhí)行JavaScript代碼。這為你提供了一個機會笼痹,可以在請求發(fā)送到服務器之前修改請求參數(shù)配喳、設置環(huán)境變量等。

要在Pre-request Script中編寫腳本凳干,你需要使用Postman內(nèi)置的JavaScript運行時環(huán)境晴裹。以下是一些常見的用法:

設置變量:你可以在Pre-request Script中設置變量,這些變量可以在請求中使用救赐。

// 設置一個名為myVar的變量
pm.variables.set("myVar", "value");

修改請求頭:你可以修改請求頭涧团,例如添加或更改Authorization頭部。

// 添加或更改請求頭
pm.request.headers.add({
    key: "Authorization",
    value: "Bearer " + pm.variables.get("accessToken"),
    enabled: true
});

動態(tài)生成請求體:你可以根據(jù)需要動態(tài)生成請求體。


// 動態(tài)生成JSON請求體
var requestBody = {
    "key1": "value1",
    "key2": pm.variables.get("myVar")
};
pm.request.body.update(requestBody);

執(zhí)行邏輯判斷:你可以根據(jù)條件執(zhí)行不同的代碼塊泌绣。

// 執(zhí)行邏輯判斷
if (pm.variables.get("condition") === "true") {
    // 當條件滿足時執(zhí)行的代碼
} else {
    // 當條件不滿足時執(zhí)行的代碼
}

調(diào)用外部API:你甚至可以在Pre-request Script中調(diào)用外部API钮追,并使用返回的數(shù)據(jù)坪稽。

// 調(diào)用外部API
var response = pm.sendRequest("http://external-api.com/data", function(err, res) {
    if (err) {
        console.error(err);
    } else {
        // 使用返回的數(shù)據(jù)
        var data = JSON.parse(res.text());
        pm.variables.set("externalData", data);
    }
});

使用pm對象:pm對象提供了許多方法和屬性沈自,可以幫助你在請求前后執(zhí)行各種操作。

// 使用pm對象
pm.environment.set("envVar", "value"); // 設置環(huán)境變量
pm.collectionVariables.set("colVar", "value"); // 設置集合變量

記住底循,Pre-request Script是在發(fā)送請求之前執(zhí)行的仿滔,因此任何在此階段設置的變量或修改的請求都會影響即將發(fā)送的請求惠毁。利用好Pre-request Script,可以極大地提高你的API測試效率和靈活性崎页。

二鞠绰、具體示例

下面介紹一種在 Postman 使用腳本自動生成簽名的方法。通過此方法可在 Postman 調(diào)試接口時自動完成簽名計算與請求發(fā)送飒焦,無需手動使用工具計算簽名并填寫 Authorization蜈膨。

下面以云服務器(CVM)的 DescribeInstances 接口為例,來說明配置步驟牺荠。

步驟1: 添加請求前置腳本

1. 請求方式選擇 POST翁巍,在地址欄輸入接口請求域名,域名可在接口說明文檔中查看休雌。

2. 單擊 Pre-request Script灶壶,添加腳本。如下圖所示:

腳本內(nèi)容如下:

const crypto =  require("crypto-js");

function  sha256(message, secret =  "", encoding)  {

 const hmac = crypto.HmacSHA256(message, secret);

 // return hmac.toString(crypto.enc.Hex);

 return hmac;

}

function  getHash(message, encoding =  "hex")  {

 const hash = crypto.SHA256(message);

 // return hash.toString(crypto.enc.Hex);

 return hash;

}

function  getDate(timestamp)  {

 const date =  new  Date(timestamp *  1000);

 const year = date.getUTCFullYear();

 const month =  ("0"  +  (date.getUTCMonth()  +  1)).slice(-2);

 const day =  ("0"  + date.getUTCDate()).slice(-2);

 return  `${year}-${month}-${day}`;

}

function  main()  {

 // 1.替換為自己的AK杈曲、SK

 const  SECRET_ID  =  "";

 const  SECRET_KEY  =  "";

 // 2.替換為自己真實的云API公共參數(shù)

 const endpoint =  "cvm.tencentcloudapi.com";

 const service =  "cvm";

 const region =  "ap-guangzhou";

 const action =  "DescribeInstances";

 const version =  "2017-03-12";

 const timestamp = Math.floor(Date.now()  /  1000);

 const date =  getDate(timestamp);

 // ************* Step 1: Concatenate the CanonicalRequest string *************

 // 3.重要:payload 替換為自己真實的業(yè)務接口請求參數(shù)驰凛!

 const payload =

 '{\"Filters\":[{\"Name\":\"instance-charge-type\",\"Values\":[\"PREPAID\"]}]}';

 const hashedRequestPayload =  getHash(payload);

 const httpRequestMethod =  "POST";

 const canonicalUri =  "/";

 const canonicalQueryString =  "";

 const canonicalHeaders =

 "content-type:application/json; charset=utf-8\n"  +

 "host:"  +

 endpoint +

 "\n"  +

 "x-tc-action:"  +

 action.toLowerCase()  +

 "\n";

 const signedHeaders =  "content-type;host;x-tc-action";

 const canonicalRequest =

 httpRequestMethod +

 "\n"  +

 canonicalUri +

 "\n"  +

 canonicalQueryString +

 "\n"  +

 canonicalHeaders +

 "\n"  +

 signedHeaders +

 "\n"  +

 hashedRequestPayload;

 console.log("----------------------------canonicalRequest");

 console.log(canonicalRequest);

 console.log("----------------------------canonicalRequest");

 // ************* Step 2: Concatenate the string to sign *************

 const algorithm =  "TC3-HMAC-SHA256";

 const hashedCanonicalRequest =  getHash(canonicalRequest);

 const credentialScope = date +  "/"  + service +  "/"  +  "tc3_request";

 const stringToSign =

 algorithm +

 "\n"  +

 timestamp +

 "\n"  +

 credentialScope +

 "\n"  +

 hashedCanonicalRequest;

 console.log("----------------------------stringToSign");

 console.log(stringToSign);

 console.log("----------------------------stringToSign");

 // ************* Step 3: Calculate the signature *************

 const kDate =  sha256(date,  "TC3"  +  SECRET_KEY);

 const kService =  sha256(service, kDate);

 const kSigning =  sha256("tc3_request", kService);

 const signature =  sha256(stringToSign, kSigning,  "hex");

 console.log("----------------------------signature");

 console.log(signature.toString(crypto.enc.Hex));

 console.log("----------------------------signature");

 // ************* Step 4: Concatenate the Authorization *************

 const authorization =

 algorithm +

 " "  +

 "Credential="  +

 SECRET_ID  +

 "/"  +

 credentialScope +

 ", "  +

 "SignedHeaders="  +

 signedHeaders +

 ", "  +

 "Signature="  +

 signature;

 console.log("----------------------------authorization");

 console.log(authorization);

 console.log("----------------------------authorization");

 const Call_Information =

 "curl -X POST "  +

 "https://"  +

 endpoint +

 ' -H "Authorization: '  +

 authorization +

 '"'  +

 ' -H "Content-Type: application/json; charset=utf-8"'  +

 ' -H "Host: '  +

 endpoint +

 '"'  +

 ' -H "X-TC-Action: '  +

 action +

 '"'  +

 ' -H "X-TC-Timestamp: '  +

 timestamp.toString()  +

 '"'  +

 ' -H "X-TC-Version: '  +

 version +

 '"'  +

 ' -H "X-TC-Region: '  +

 region +

 '"'  +

 " -d '"  +

 payload +

 "'";

 console.log("----------------------------Call_Information");

 console.log(Call_Information);

 console.log("----------------------------Call_Information");

 // 注入Postman全局變量

 pm.globals.set("authorization", authorization)

 pm.globals.set("payload", payload)

 pm.globals.set("host", endpoint)

 pm.globals.set("action", action)

 pm.globals.set("version", version)

 pm.globals.set("region", region)

 pm.globals.set("timestamp", timestamp.toString())

}

main();

請注意,以上腳本中的三個部分需要根據(jù)您的實際情況進行替換担扑。

替換1:將 SECRET_IDSECRRT_KEY 替換為您自己的訪問密鑰(AK恰响、SK)。您可以在 API 密鑰管理 平臺獲取這些密鑰涌献。

 // 1.替換為自己的AK胚宦、SK

 const  SECRET_ID  =  "";

 const  SECRET_KEY  =  "";

替換2:將下面的公共參數(shù)值替換為實際請求 API 的參數(shù)值。您可以在接口文檔中找到這些參數(shù)值燕垃。

 // 2.替換為自己真實的云API公共參數(shù)

 const endpoint =  "cvm.tencentcloudapi.com";

 const service =  "cvm";

 const region =  "ap-guangzhou";

 const action =  "DescribeInstances";

 const version =  "2017-03-12";

替換3:將payload替換為真實的請求入?yún)ⅰ?/p>

 // 3.重要:payload 替換為自己真實的業(yè)務接口請求參數(shù)枢劝!

 const payload =

 '{\"Filters\":[{\"Name\":\"instance-charge-type\",\"Values\":[\"PREPAID\"]}]}';

步驟2:在 Headers添加頭部信息

在 Headers 部分添加以下鍵值對:
Authorization:{{authorization}}

Content-Type:application/json;charset=utf-8

Host:{{host}}

X-TC-Action:{{action}}

X-TC-Timestamp:{{timestamp}}

X-TC-Version:{{version}}

X-TC-Region:{{region}}

步驟3:替換 Body 為 {{payload}}

在 Body 部分,選擇 Raw卜壕,然后選擇 Json呈野,在輸入框中輸入 {{payload}}


通過這樣的設置印叁,我們將腳本中的變量值存儲到 Postman 的全局變量中,從而完成了請求的構(gòu)建。

步驟4:發(fā)起請求

單擊 Send轮蜕,即可發(fā)起請求昨悼。在 Response 的 Body 部分,您可以查看到接口的響應結(jié)果跃洛。

通過以上步驟率触,我們在 Postman 完成了自動計算簽名能力的配置。后續(xù)的接口調(diào)試汇竭,您只需在腳本中修改接口的公共參數(shù)及入?yún)⒓纯砂l(fā)起調(diào)用葱蝗,無需再進行手工簽名計算。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末细燎,一起剝皮案震驚了整個濱河市两曼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玻驻,老刑警劉巖悼凑,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異璧瞬,居然都是意外死亡户辫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門嗤锉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渔欢,“玉大人,你說我怎么就攤上這事瘟忱“露睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵酷誓,是天一觀的道長披坏。 經(jīng)常有香客問我,道長盐数,這世上最難降的妖魔是什么棒拂? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮玫氢,結(jié)果婚禮上帚屉,老公的妹妹穿的比我還像新娘。我一直安慰自己漾峡,他們只是感情好攻旦,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著生逸,像睡著了一般牢屋。 火紅的嫁衣襯著肌膚如雪且预。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天烙无,我揣著相機與錄音锋谐,去河邊找鬼。 笑死截酷,一個胖子當著我的面吹牛涮拗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迂苛,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼三热,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了三幻?” 一聲冷哼從身側(cè)響起就漾,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赌髓,沒想到半個月后从藤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡锁蠕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年夷野,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荣倾。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡悯搔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舌仍,到底是詐尸還是另有隱情妒貌,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布铸豁,位于F島的核電站灌曙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏节芥。R本人自食惡果不足惜在刺,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望头镊。 院中可真熱鬧蚣驼,春花似錦、人聲如沸相艇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坛芽。三九已至留储,卻和暖如春翼抠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背获讳。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工机久, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赔嚎。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像胧弛,于是被迫代替她去往敵國和親尤误。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容