一、基本介紹
在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_ID
和SECRRT_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)用葱蝗,無需再進行手工簽名計算。