跳转到内容

MockHttpItem

HTTP Mock 配置项接口,用于定义单个 HTTP 接口的 Mock 响应。

接口定义

ts
interface MockHttpItem extends MockBaseItem {
  method?: Method | Method[]
  headers?: Headers | ResponseHeaderFn
  status?: number
  statusText?: string
  delay?: number | [number, number]
  cookies?: ResponseCookies | ResponseCookiesFn
  type?: 'text' | 'json' | 'buffer' | string
  body?: ResponseBody | ResponseBodyFn
  response?: ResponseFn
  validator?: Validator | ValidatorFn
  error?: MockErrorConfig
  ws?: false
}

基础属性

url

  • 类型: string
  • 必填: 是
  • 描述: 请求路径,支持动态参数

使用 path-to-regexp 进行路径匹配。

ts
export default defineMock({
  url: '/api/users', // 静态路径
  url: '/api/users/:id', // 动态参数
  url: '/api/*path', // 通配符匹配
})

enabled

  • 类型: boolean
  • 默认值: true
  • 描述: 是否启用当前 Mock 配置
ts
export default defineMock({
  url: '/api/test',
  enabled: false // 临时禁用
})

method

  • 类型: Method | Method[]
  • 默认值: ['GET', 'POST']
  • 描述: 允许的 HTTP 方法
ts
type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'TRACE' | 'OPTIONS'

// 仅 GET
export default defineMock({
  url: '/api/users',
  method: 'GET'
})

// GET 或 POST
export default defineMock({
  url: '/api/users',
  method: ['GET', 'POST']
})

响应配置

status

  • 类型: number
  • 默认值: 200
  • 描述: HTTP 响应状态码
ts
export default defineMock({
  url: '/api/not-found',
  status: 404
})

statusText

  • 类型: string
  • 默认值: 'OK'
  • 描述: HTTP 响应状态文本
ts
export default defineMock({
  url: '/api/error',
  status: 500,
  statusText: 'Internal Server Error'
})

headers

  • 类型: Headers | (request: MockRequest) => Headers
  • 描述: 自定义响应头
ts
export default defineMock({
  url: '/api/custom',
  headers: {
    'X-Custom-Header': 'value',
    'X-Request-ID': '12345'
  }
})

// 动态响应头
export default defineMock({
  url: '/api/dynamic-header',
  headers: request => ({
    'X-User-Agent': request.headers['user-agent']
  })
})

type

  • 类型: 'text' | 'json' | 'buffer' | string
  • 默认值: 'json'
  • 描述: 响应体类型,自动设置对应的 Content-Type
ts
export default defineMock({
  url: '/api/text',
  type: 'text',
  body: 'Plain text response'
})

export default defineMock({
  url: '/api/file',
  type: 'application.pdf', // 自动解析为 application/pdf
  body: pdfBuffer
})

body

  • 类型: ResponseBody | (request: MockRequest) => ResponseBody | Promise<ResponseBody>
  • 描述: 响应体数据
ts
type ResponseBody = string | object | any[] | number | Buffer | Readable | null

// 静态数据
export default defineMock({
  url: '/api/user',
  body: { id: 1, name: 'John' }
})

// 动态数据
export default defineMock({
  url: '/api/user/:id',
  body: ({ params }) => ({
    id: params.id,
    name: `User ${params.id}`
  })
})

// 异步数据
export default defineMock({
  url: '/api/async',
  body: async ({ query }) => {
    const data = await fetchExternalData(query.id)
    return data
  }
})

response

  • 类型: (req: MockRequest, res: MockResponse, next: NextFunction) => void | Promise<void>
  • 描述: 自定义响应处理函数

body 无法满足需求时,可以使用 response 完全控制响应过程。

ts
export default defineMock({
  url: '/api/custom',
  response: (req, res, next) => {
    // 获取解析后的请求信息
    const { query, params, body, headers } = req

    // 设置响应头
    res.setHeader('Content-Type', 'application/json')
    res.setCookie('token', 'abc123', { httpOnly: true })

    // 发送响应
    res.statusCode = 200
    res.end(JSON.stringify({
      message: 'Custom response',
      query,
      params
    }))
  }
})

高级配置

delay

  • 类型: number | [number, number]
  • 默认值: 0
  • 描述: 响应延迟时间(毫秒)
ts
export default defineMock({
  url: '/api/slow',
  delay: 2000 // 延迟 2 秒
})

// 随机延迟 1-3 秒
export default defineMock({
  url: '/api/random-delay',
  delay: [1000, 3000]
})

cookies

  • 类型: ResponseCookies | (request: MockRequest) => ResponseCookies
  • 描述: 设置响应 Cookie
ts
type CookieValue = string | [string, SetCookieOption]
type ResponseCookies = Record<string, CookieValue>

export default defineMock({
  url: '/api/login',
  cookies: {
    session: 'abc123',
    user: ['john', { path: '/', httpOnly: true }]
  }
})

validator

  • 类型: Partial<RequestOptions> | (request: MockRequest) => boolean
  • 描述: 请求验证器

用于在多个相同 URL 的 Mock 配置中,根据请求参数决定使用哪个配置。

ts
// 对象形式验证
export default defineMock([
  {
    url: '/api/search',
    validator: { query: { type: 'user' } },
    body: { users: [] }
  },
  {
    url: '/api/search',
    validator: { query: { type: 'post' } },
    body: { posts: [] }
  }
])

// 函数形式验证
export default defineMock([
  {
    url: '/api/data',
    validator: request => request.headers['x-role'] === 'admin',
    body: { sensitive: 'data' }
  },
  {
    url: '/api/data',
    body: { public: 'data' }
  }
])

error

  • 类型: MockErrorConfig
  • 描述: 错误模拟配置
ts
interface MockErrorConfig {
  probability?: number // 错误概率 0-1,默认 0.5
  status?: number // 错误状态码,默认 500
  statusText?: string // 错误状态文本
  body?: ResponseBody // 错误响应体
}

export default defineMock({
  url: '/api/unstable',
  error: {
    probability: 0.3, // 30% 概率返回错误
    status: 503,
    statusText: 'Service Unavailable'
  }
})

完整示例

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

export default defineMock([
  // 基础 GET 接口
  {
    url: '/api/users',
    method: 'GET',
    body: [
      { id: 1, name: 'John' },
      { id: 2, name: 'Jane' }
    ]
  },

  // 带延迟的 POST 接口
  {
    url: '/api/users',
    method: 'POST',
    delay: 500,
    body: ({ body }) => ({
      id: Date.now(),
      ...body,
      createdAt: new Date().toISOString()
    })
  },

  // 动态路由
  {
    url: '/api/users/:id',
    method: 'GET',
    validator: { params: { id: /^\d+$/ } },
    body: ({ params }) => ({
      id: Number(params.id),
      name: `User ${params.id}`
    })
  },

  // 带 Cookie 的登录接口
  {
    url: '/api/login',
    method: 'POST',
    cookies: {
      'auth-token': ['jwt-token-here', { httpOnly: true, maxAge: 86400000 }]
    },
    body: ({ body }) => ({
      success: true,
      user: { id: 1, email: body.email }
    })
  },

  // 自定义响应
  {
    url: '/api/download',
    response: (req, res) => {
      res.setHeader('Content-Disposition', 'attachment; filename="data.json"')
      res.setHeader('Content-Type', 'application/json')
      res.end(JSON.stringify({ data: 'content' }))
    }
  }
])

基于 MIT 许可发布