iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0

今日主題

今天的主題Dynamic request bodies聽起來很高大上,但其實也只是前面介紹過的那些章節所集結而成的應用題,包含以下這些概念:

在開始挑戰前,記得先把 Day 25: Dynamic request bodies 複製到自己的工作區。

回到自己的工作區,打開今天的資料夾Dynamic request bodies,根據右方的文件,可以理解今天的內容主要是針對POST請求內的主體內容,將其用動態變數取代,這樣做的好處是當同一個URL需要不同的主體內容時,不需要重複定義好幾個請求出來,可以共用設定、測試,只讓少數內容去變動,在管理上很有幫助。具體的步驟如下:

  • 新增請求:
    這步驟預期新增一個主體是變數的請求,之後會用腳本動態去調整實際的值
    • 命名為 color
    • 方法為 POST
    • URL https://postman-echo.com/post
      這個API單純把我們參數帶的資料直接傳回來,方便我們用測試確認動態內容有正確傳過去
    • body 選擇rawJSON,並填入變數
      {{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);
    });
    
  • submit
    到這邊就可以嘗試submit來確認是否通過今天的挑戰囉

今日回顧

在今天的挑戰裡,我們實際體驗了動態去修改請求主體內的內容,不過使用faker變數可能會讓人比較無感,只是單純展現動態主體的概念。可以想像一下如果今天動態的內容是取決於其他請求的內容,先透過Pre-request執行API 1取得部分內容,將其回應當作API 2的主體內容,或是動態的變數是某些計算的結果,這些概念是一樣的,這些動態主體的做法可以避免不必要的API複製,透過共享測項來使管理更方便。

那今天就到這邊,我們明天見~


上一篇
Postman challenge Day 24 - 進階腳本使用函式庫 (Using libraries)
下一篇
Postman challenge Day 26 - HTML解析 (Parse HTML response)
系列文
[POSTMAN] 該知道的都知道,不知道的慢慢了解 - 與波斯麵三十天的感情培養32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言