iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0

今日主題

在前面章節中,曾介紹過使用Postman Console來輸出偵錯的資訊,但有時候會希望能把這些資訊或是請求的結果輸出成檔案,用來統一蒐集紀錄進而分析或統計,也可以用來自動輸出生成Mock API需要的範例資料。可惜的是,無法透過Postman提供的TestsPre-request直接輸出檔案,因為沒有任何API能夠做到,加上Postman的沙箱環境沒有我們硬碟的存取權限,所以必須透過間接的方式 - local server本地伺服器來達成。

建立 local server

第一步我們需要先建立起一個本地伺服器,它的作用是接收需要被記錄的資訊,然後進行輸出檔案,而建立本地的HTTP服務器有許多種方式,例如透過docker跑apache2、 nginx等等,但由於這邊的需求很單純,只需要收資料並記錄,所以官方也有給範例,可以很快的透過Node.js來建立。

  1. 安裝Node.js,根據平台選擇,以下步驟用windows為例
  2. 建立資料夾local_server,並開啟命令提示字元進入此資料夾
  3. 使用Node.js附帶的套件管理npm來安裝需要的套件,在命令提示字元下輸入:
    npm install express fs body-parser
    
    這樣會在當前資料夾local_server下把相關的依賴都安裝到node_modules這個資料夾,其中主要會使用到套件
    • express: 一個輕量的web框架,快速啟動HTTP伺服器
    • fs: 透過這個模組,能夠對檔案系統進行讀寫操作
    • body-parser: 用來處理收到的請求body內容
  4. 撰寫script.js,也可以從這裡直接下載,放到當前資料夾下
    var express = require('express');
    var fs = require('fs');
    var bodyParser = require('body-parser');
    
    var app = express();
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json()); // Body parser use JSON data
    
    app.post('/launches', function(req, res) {
        var outputFilename = './spaceReport.json'; // path of the file to output
        fs.writeFileSync(outputFilename, JSON.stringify(JSON.parse(req.body.payload), null, 4)); // write to the file system
        res.send('Saved to ' + outputFilename);
    });
    
    var port = 3000;
    app.listen(port);
    console.log('Express started on port %d ...', port);
    
  5. 啟動HTTP伺服器
    node script.js
    
    從程式碼可以看到express會監聽3000 port來的請求,所以這時候打開瀏覽器前往http://localhost:3000,其實可以看到頁面會顯示"Cannot GET /",這是因為我們在程式碼裡面只有開了POST /launches的API,負責把透過此API送過來的資料讀出來,然後寫到一個叫做spaceReport.json的檔案裏面。至此,我們已經建立好一個本地伺服器了,所以接下面我們要經由今天的挑戰內容來體驗如何與Postman進行串接。

今日挑戰

在挑戰開始之前,記得先把 Day 15: Write to file 複製到自己的工作區內,並看一下關於今天挑戰的文件說明。

今日的挑戰目的是要建立一個請求,然後把該請求的回應內容存成檔案,步驟如下

  • 新增請求: 在今天挑戰的資料夾Write to file下新增請求,並重新命名為spacex,去GET https://api.spacexdata.com/v4/launches/latest取的資料。
  • 新增測試: 由於希望是在請求結束後取得回應內容,所以要Tests分頁下而不是Pre-request來撰寫腳本,這邊就是串接主要執行的工作了
    pm.sendRequest({
     url: 'http://localhost:3000/launches',
     method: 'POST',
     header: 'Content-Type:application/x-www-form-urlencoded',
     body: {
         mode: 'urlencoded',
         urlencoded: `payload=${pm.response.text()}`
     }
    }, function (err, res) {
     console.log(res)
    })
    
    這個腳本重點在於pm.response以及pm.sendRequest,前者用來讀取回應的內容,後者用來另外發出另一個請求,請求的API就是前面我們架設的本地伺服器。
  • 發送請求: 在Send取的回應後,會執行到Tests剛定義的腳本,這邊會把回應內容轉發給本地伺服器,最後本地伺服器會把收到的內容寫到檔案spaceReport.json,可以打開檔案看一下是不是就是GET取得的回應。到這邊就可以進行Submit來通過今天的挑戰了。

今日回顧

今天我們實際架了一個本地伺服器,用以跟Postman進行串接,也就是說我們也能夠進一步地擴充伺服器的API,去滿足不同的用途,例如可以讓Postman每個請求結束後都去通知local,讓local來進行統計每日API次數等等。也可以讓local收到資料後,根據商業邏輯去分門別類,讓不同檔案有不同的意義。

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


上一篇
Postman challenge Day 14 - OAuth 2.0
下一篇
Postman challenge Day 16 - 分頁處理 (Pagination)
系列文
[POSTMAN] 該知道的都知道,不知道的慢慢了解 - 與波斯麵三十天的感情培養32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言