动态和有状态的模拟服务器

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”。我们在上面的示例中指定了自定义错误消息。

这是一个坚实的开始,您可以使用返回简单预设响应的服务做很多事情,但它们只能让您走到这一步。让我们继续通过持久化数据和动态生成响应来为我们的服务添加真实的行为。