---
url: /zh/examples/validator.md
---
# 请求验证器

有时候，对于相同的URL，我们需要根据不同的请求参数，返回不同的内容，但又不想通过 函数形式的 `body` 在函数内部处理。
在这种情况下可以通过 `validator` 配置，根据不同的 请求参数，返回不同的响应内容

## GET请求校验query是否匹配

链接参数中包含该参数即可，无需全匹配。

```ts
import { defineMock } from 'vite-plugin-mock-dev-server'

export default defineMock([
  // match /api/post?id=1000
  {
    url: '/api/post',
    validator: {
      query: { id: '1000' },
    },
    body: {
      code: 200,
      message: 'success',
      result: {
        id: '1000',
        title: 'post-1000',
        content: 'post-1000 content',
        author: 'Mark',
      },
    },
  },
  {
    url: '/api/post',
    validator: {
      query: { id: '1001' },
    },
    body: {
      code: 200,
      message: 'success',
      result: {
        id: '1001',
        title: 'post-1001',
        content: 'post-1001 content',
        author: 'John',
      },
    },
  },
  {
    // match query include field `id` and value is 1003
    // like {url: '/api/post', validator: { query: { id: '1003' } }}
    url: '/api/post?id=1003',
    body: {
      code: 200,
      message: 'success',
      result: {
        id: '1003',
        title: 'post-1003',
        content: 'post-1003 content',
        author: 'Joy',
      },
    },
  },
  // Fallback, when the validator does not have a matching result, will use the configuration without validators as the response.
  {
    url: '/api/post',
    body: {
      code: 200,
      message: 'success',
      result: {
        id: 1000 + Math.floor(Math.random() * 1000),
        title: 'random post title',
      },
    },
  },
])

```

## POST请求校验body是否匹配

请求body中包含该参数即可，无需全匹配。

```ts
import { defineMock } from 'vite-plugin-mock-dev-server'

export default defineMock([
  {
    url: '/api/post-update',
    validator: {
      body: {
        shouldUpdate: true,
      },
    },
    body: {
      code: 200,
      message: 'success',
      result: { updated: true },
    },
  },
  {
    url: '/api/post-update',
    validator: {
      body: {
        shouldUpdate: false,
      },
    },
    body: {
      code: 200,
      message: 'success',
      result: { updated: false },
    },
  },
])

```

## 动态路径校验params是否匹配

校验 动态路径 中的 params 参数是否匹配

```ts
import { defineMock } from 'vite-plugin-mock-dev-server'

export default defineMock([
  // match /api/post/1001
  {
    url: '/api/post/:postId',
    validator: {
      params: { postId: '1001' },
    },
    body: {
      code: 200,
      message: 'success',
      result: {
        id: '1001',
        title: 'post-1001',
        content: 'post-1001 content',
      },
    },
  },
  // match /api/post/1002
  {
    url: '/api/post/:postId',
    validator: {
      params: { postId: '1002' },
    },
    body: {
      code: 200,
      message: 'success',
      result: {
        id: '1002',
        title: 'post-1002',
        content: 'post-1002 content',
      },
    },
  },
])

```

## 校验请求来源地址参数是否匹配

请求来源地址，指的是，发起 mock api 请求的来源地址，
可以是指一个在浏览器中打开的页面发起的mock 请求，那么打开的页面即是来源地址。
可以是指在一个server请求中发起的 mock api 请求，server请求即是来源地址。

通过 来源地址中的 `query` 参数，来匹配返回的 mock 数据内容

```ts
import { defineMock } from 'vite-plugin-mock-dev-server'
import postList from './data/post.js'

// Different pages send the same interface and can get different
// data through the query parameter of the source page
export default defineMock([
  // localhost/post.html?from=post-page
  // send request /api/post/list
  {
    url: '/api/post/list',
    validator: {
      refererQuery: { from: 'post-page' },
    },
    body: {
      list: postList,
    },
  },
  // localhost/recommend.html?from=recommend-page
  // send request /api/post/list
  {
    url: '/api/post/list',
    validator: {
      refererQuery: { from: 'recommend-page' },
    },
    body: {
      list: postList.slice(0, 4),
    },
  },
])

```

## 函数形式的校验器

有时候仅适用严格匹配的方式校验参数并不能满足需要，那么可以使用 函数形式来定义 校验器，并返回 boolean 值。

可以更加灵活的校验请求中的 各种信息

```ts
import { defineMock } from 'vite-plugin-mock-dev-server'

export default defineMock([
  {
    url: '/api/validator-check-cookie',
    validator(request) {
      const token = request.getCookie('token')
      return !token
    },
    body: {
      message: 'token expired.',
    },
  },
  {
    url: '/api/validator-body-include',
    validator(request) {
      const ids = request.body.ids ?? []
      return !ids.includes('1001')
    },
    body: {
      code: 200,
      message: 'ids must be include 1001',
    },
  },
])

```

## 深度校验 body 是否匹配

对于请求体 body，其数据结构可能相对复杂，需要深度校验。
插件支持判断 验证器配置的 body 是否 属于 请求体 body 的 子集。

::: code-group

```ts [api.mock.ts]
export default defineMock({
  url: '/mock/validator-body',
  validator: {
    body: {
      a: [1, 2], // 数组的项 必须都在 请求体 的 a 中
      b: { c: 1 },
    },
  },
  body: '',
})
```

```ts [fetch.ts]
await fetch('/mock/validator-body', {
  method: 'POST',
  body: JSON.stringify({
    a: [1, 2, 3, 4],
    b: { c: 1, d: 2 },
    c: 1,
  }),
})
```

:::

::: info
不仅 验证器中的 body 支持 深度校验，query、refererQuery 等也均支持。
:::
