今天的主題Dynamic request bodies
聽起來很高大上,但其實也只是前面介紹過的那些章節所集結而成的應用題,包含以下這些概念:
在開始挑戰前,記得先把 Day 25: Dynamic request bodies 複製到自己的工作區。
回到自己的工作區,打開今天的資料夾Dynamic request bodies
,根據右方的文件,可以理解今天的內容主要是針對POST
請求內的主體內容,將其用動態變數取代,這樣做的好處是當同一個URL需要不同的主體內容時,不需要重複定義好幾個請求出來,可以共用設定、測試,只讓少數內容去變動,在管理上很有幫助。具體的步驟如下:
color
POST
https://postman-echo.com/post
raw
的JSON
,並填入變數
{{payload}}
Pre-requests
thecolorapi
提供的API,然後把亂數取得的內容當作我們動態變數的內容,填入前面步驟準備好的變數payload
。
查詢文件
了解到可以提供一個id?hex=
來取得某個顏色的資料,這邊會利用到{{$randomHexColor}}
這個前面提過的Postman提供的faker變數,不過亂數的值會包含#
字元,因此這邊用slice
進行切割,另外faker變數需要透過pm.variables.replaceIn
才能取得,因此亂數的取得的腳本執行語句如下
let hex = pm.variables.replaceIn('{{$randomHexColor}}').slice(1)
組成請求並發送
將前面取得的hex
變數組成完整的color請求,然後透過pm.sendRequest
來發送
let colorRequest = 'https://www.thecolorapi.com/id?hex=' + hex;
console.log(colorRequest)
// Example with a plain string URL
pm.sendRequest(colorRequest, (error, response) => {
...
}
組成 payload 變數內容:
取得color請求的回應後,根據要求的欄位來組成JSON
資料,最後用stringify
轉成字串放到環境變數裡,這邊選擇放到collection變數,完整的腳本如下
let hex = pm.variables.replaceIn('{{$randomHexColor}}').slice(1)
let colorRequest = 'https://www.thecolorapi.com/id?hex=' + hex;
console.log(colorRequest)
// Example with a plain string URL
pm.sendRequest(colorRequest, (error, response) => {
if (error) {
console.log(error);
} else {
let data = response.json();
let payload = {
hex: data.hex.value,
rgb: data.rgb.value,
name: data.name.value
}
pm.collectionVariables.set('payload', JSON.stringify(payload));
}
});
Tests
Pre-requests
編輯完後,按下Send
就會先產生動態的payload
,然後發送到echo API,所以這邊要針對echo的回應進行測試,以下確認能夠取得200
狀態,然後把echo回來的data內容轉成字串,確認它一定要與當前環境變數所指定的payload
一樣才行。
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
pm.test("Check payload", function () {
var jsonData = pm.response.json();
let payload = pm.collectionVariables.get("payload")
pm.expect(JSON.stringify(jsonData.data)).to.eql(payload);
});
在今天的挑戰裡,我們實際體驗了動態去修改請求主體內的內容,不過使用faker變數可能會讓人比較無感,只是單純展現動態主體的概念。可以想像一下如果今天動態的內容是取決於其他請求的內容,先透過Pre-request
執行API 1取得部分內容,將其回應當作API 2的主體內容,或是動態的變數是某些計算的結果,這些概念是一樣的,這些動態主體的做法可以避免不必要的API複製,透過共享測項來使管理更方便。
那今天就到這邊,我們明天見~