[推薦] 簡易的自架 mock server – Wiremock

平常在開發程式的時候可能會有需要使用第三方 API 的情況,但是如果第三方的服務並沒有提供測試環境時,就會需要有個假的 mock API server 來模擬 API 行為,現在較多人使用的便是 Postman mock server,而 Postman mock server 是使用 Postman 的伺服器,如果想要自己架設簡易的 mock server,可以選擇 Wiremock,其 Open Source 版本有提供 admin API 進行管理 mock 內容

相關連結與介紹

官方網站:https://wiremock.org/
文件:https://wiremock.org/docs/
API 文件:https://wiremock.org/docs/standalone/admin-api-reference/
原始碼:https://github.com/wiremock/wiremock

Wiremock 有兩種版本,一是可以自行架設的 OpenSource 版本而另外的則是官方架設的 Cloud 版本,open source 版本並沒有提供 GUI 介面,而 Cloud 的版本才有能透過 Web 管理功能,雖然有其他使用者自行開發了非官方的 GUI 版本,但是目前已經沒有在維護了,官方有提供 OpenAPI 文件,如有需要可以自行撰寫 Frontend 管理 API

啟動

目前官方有提供兩種版本來啟動,一是 java 版本,二是使用 docker 方式啟動,這邊方便 Demo 使用 docker 方式啟動

使用 docker 指令啟動在 8031 port

docker run -it  --restart=always -d \
  -p 8031:8080 \
  --name wiremock \
  wiremock/wiremock:2.35.0

如果是會需要使用 dynamic response 的需要加上參數 –global-response-templating

docker run -it  --restart=always -d \
  -p 8031:8080 \
  --name wiremock \
  wiremock/wiremock:2.35.0 --global-response-templating --verbose

基本用法

詳細用法可以參考官方文件,這邊列出幾個比較常用的 admin API

列出目前 mock 了哪些 API

首先透過可以透過 admin mappings 取得目前有哪些 mock API

  • [GET] /__admin/mappings?limit=10&offset=0

透過 admin API 新增 endpoint

  • [POST] /__admin/mappings
{
  "request": {
    "method": "GET",
    "url": "/some/thing"
  },
  "response": {
    "body": "{\"message\": \"Hello world!\"}",
    "headers": {
      "Content-Type": "application/json"
    },
    "status": 200
  }
}

這時就可以直接打該網址取得 mock 的結果

動態 response 範例:

{
  "request": {
    "method": "GET",
    "url": "/dynamic-response"
  },
  "response": {
    "body": "{\"currentTime\": \"{{now format='yyyy-MM-dd HH:mm:ssZ'}}\"}",
    "headers": {
      "Content-Type": "application/json"
    },
    "status": 200
  }
}

列出收到的 request 紀錄

wiremock 會紀錄所有的 API payload 與 response,可以透過 list request API 查看有哪些 API request

  • [GET] /__admin/requests?limit=<integer>&since=<datetime-string>

取得指定 request 詳細紀錄

如果需要單一 request 詳細紀錄的,可以只取得指定 request 內容

  • [GET] /__admin/requests/:requestId

刪除指定 mock

當某個 API 已經不需要時,可以使用 API 將其刪除

  • [DELETE] /__admin/mappings/:stubMappingId

發表迴響