動態和有狀態的模擬服務器

APIGit

2022-10-15

APIGit 支持動態的、有狀態的和可編程的模擬服務器來輕鬆模擬任何復雜的業務邏輯。 HTTP 請求消息通過使用 mock.define() 定義路由並提供 URL 模式、HTTP 動詞和回調函數來處理。例如:

mock.define('/users', 'GET', function(req, res) {
    ...
  })

或者,對於 POST 方法:

mock.define('/users', 'POST', function(req, res) {
    ...
  })

支持標準 HTTP 方法,例如“DELETE”、“PUT”和“OPTIONS”方法。您提供的回調函數總是傳遞兩個對像作為參數,即 Request 和 Response 對象。 Request 對象包含與傳入請求有關的所有數據,例如標頭、正文有效負載和參數。我們使用 Response 對象來構建對請求的響應。

讓我們擴展上面的示例並開始為用戶構建一個基本的 CRUD 服務。首先,讓我們定義一個路由來返回一組用戶:

mock.define('/users', 'GET', function(req, res) {
    var users = [ 
      { username: "dave", email: "dave@gmail.com" },
      { username: "john", email: "john@gmail.com" }
    ]
  
    return res.json(users)
  })

res.json 調用將向調用應用程序發送 JSON 響應。請記住在 res 對像上調用響應函數,否則您的服務將超時並且不會返回成功的結果。稍後我們將探索其他可用的響應函數

讓我們使用查詢參數添加對基於用戶年齡的過濾的支持。 req.query 是包含已解析查詢字符串的對象,默認為 {}。如果我們提交“GET /users?age=30”請求,我們可以使用 req.query.age 訪問年齡值:

mock.define('/users', 'GET', function(req, res) {
    var users = [
      { username: "dave", email: "dave@gmail.com", age: 32 },
      { username: "john", email: "john@gmail.com", age: 30 }
    ]
  
    if (req.query.age) {
      // convert req.query.age from String to a Number before filtering
      return res.json(_.filter(users, { 'age': Number(req.query.age) }))
    }
  
    return res.json(users)
  })

我們使用 LoDash _.filter 函數來提取與提供的年齡相匹配的用戶數組。如果沒有用戶符合年齡標準,則返回一個空數組。完整的 LoDash 庫可供使用,它提供了用於操作數組和對象的有用函數。

為了創建用於檢索單個用戶的路由,我們使用路由參數作為服務 URL 路徑的一部分。路由參數是使用 {route_param_name} 語法指定的,因此在我們的示例中,通過用戶名檢索用戶的 URL 路徑將是/users/{username}。 req.params 是一個包含映射到命名路由參數的屬性的對象,我們的用戶名將作為 req.params.username 提供。

mock.define('/users/{username}', 'GET', function(req, res) {
    var users = [
      { username: "dave", email: "dave@gmail.com", age: 32 },
      { username: "john", email: "john@gmail.com", age: 30 }
    ]
  
    // respond with the user or an empty object if user doesnt exist
    return res.json(_.find(users, { 'username': req.params.username }) || {})
  })

讓我們添加一個用於創建用戶的路由。我們將驗證用戶名是否已隨請求一起發送,如果缺少則返回 400 錯誤。在 POST 請求中作為正文有效負載發送的數據可在 req.body 對像上訪問。

mock.define('/users', 'POST', function(req, res) {
    // validate username is present
    if (req.body.username === undefined) {
      return res.json(400, { error: { message: "Missing username" } })
    }
  
    return res.json({ status: "ok" })
  })

默認情況下,所有響應都返回 200。如果將數字作為唯一參數提供給 res.json,則會為您分配一個響應正文字符串。例如,400 將響應“Bad Request”。我們在上面的示例中指定了自定義錯誤消息。

這是一個堅實的開始,您可以使用返回簡單預設響應的服務做很多事情,但它們只能讓您走到這一步。讓我們繼續通過持久化數據和動態生成響應來為我們的服務添加真實的行為。