Skip to content

请求配置

请求相关配置定义在 src/config/response.ts 中。

响应配置

typescript
// src/config/response.ts
export const responseConfig = {
  // 状态码字段名
  codeField: 'code',
  
  // 数据字段名
  dataField: 'data',
  
  // 消息字段名
  messageField: 'msg',
  
  // 成功状态码
  successCode: 0
}

响应格式

后端 API 应返回统一格式:

json
{
  "code": 0,
  "data": {
    "list": [],
    "total": 100
  },
  "msg": "success"
}

成功响应

json
{
  "code": 0,
  "data": { "id": 1, "name": "张三" },
  "msg": "操作成功"
}

错误响应

json
{
  "code": 500,
  "data": null,
  "msg": "服务器错误"
}

常用状态码

状态码说明
0成功
401未登录
403无权限
404资源不存在
500服务器错误

请求拦截器

src/service/request/ 中配置请求拦截器:

typescript
// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 添加 token
    const token = getToken()
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

响应拦截器

typescript
// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    const { code, data, msg } = response.data
    
    // 成功
    if (code === responseConfig.successCode) {
      return data
    }
    
    // 未登录
    if (code === 401) {
      // 跳转登录页
      router.push('/login')
      return Promise.reject(new Error(msg))
    }
    
    // 其他错误
    window.$message?.error(msg)
    return Promise.reject(new Error(msg))
  },
  (error) => {
    // 网络错误
    window.$message?.error('网络错误')
    return Promise.reject(error)
  }
)

JSON 渲染器请求配置

JSON Schema 中的 fetch 请求使用独立配置:

typescript
// src/config/json-renderer.ts
export const jsonRendererConfig = {
  // API 基础 URL
  baseURL: import.meta.env.VITE_SERVICE_BASE_URL || '',
  
  // 响应数据提取路径
  responseDataPath: responseConfig.dataField,
  
  // API 响应格式配置(与 responseConfig 保持一致)
  responseFormat: {
    codeField: responseConfig.codeField,
    msgField: responseConfig.messageField,
    dataField: responseConfig.dataField,
    successCode: responseConfig.successCode
  },
  
  // 默认请求头
  defaultHeaders: {
    'Content-Type': 'application/json'
  },
  
  // 请求超时时间(毫秒)
  timeout: 30000,
  
  // 是否自动携带 token
  withToken: true,
  
  // token 存储 key
  tokenKey: 'token',
  
  // token 请求头名称
  tokenHeaderName: 'Authorization',
  
  // token 前缀
  tokenPrefix: 'Bearer '
}

配置同步

jsonRendererConfig.responseFormatresponseConfig 获取配置,确保 JSON Schema 请求与普通请求使用相同的响应格式判断逻辑。

在 JSON Schema 中使用

基本请求

json
{
  "fetch": "/api/users",
  "then": [
    { "set": "list", "value": "{{ $response }}" }
  ]
}

$response 会自动提取 responseFormat.dataField 指定的数据。

业务状态码判断

vschema 会自动根据 responseFormat.successCode 判断请求是否成功:

json
{
  "fetch": "/api/user",
  "then": [
    { "set": "user", "value": "{{ $response }}" },
    { "call": "$message.success", "args": ["加载成功"] }
  ],
  "catch": [
    { "call": "$message.error", "args": ["{{ $error.message }}"] }
  ]
}

当后端返回 { code: 500, msg: "服务器错误", data: null } 时:

  • 自动触发 catch 回调
  • $error.message = "服务器错误"

完整请求

json
{
  "fetch": "/api/user",
  "method": "POST",
  "headers": {
    "X-Custom-Header": "value"
  },
  "body": "{{ form }}",
  "then": [
    { "call": "$message.success", "args": ["保存成功"] }
  ],
  "catch": [
    { "call": "$message.error", "args": ["保存失败:{{ $error.message }}"] }
  ]
}

自定义响应格式

如果后端响应格式不同,修改 responseConfig

typescript
// 后端返回格式:{ status: 'ok', result: {...}, message: '...' }
export const responseConfig = {
  codeField: 'status',
  dataField: 'result',
  messageField: 'message',
  successCode: 'ok'
}

修改后,jsonRendererConfig.responseFormat 会自动同步更新。

文件上传

json
{
  "fetch": "/api/upload",
  "method": "POST",
  "headers": {
    "Content-Type": "multipart/form-data"
  },
  "body": "{{ formData }}",
  "then": [
    { "set": "uploadResult", "value": "{{ $response }}" }
  ]
}

错误处理最佳实践

json
{
  "methods": {
    "loadData": [
      { "set": "loading", "value": true },
      { "set": "error", "value": null },
      {
        "fetch": "/api/data",
        "then": [
          { "set": "data", "value": "{{ $response }}" }
        ],
        "catch": [
          { "set": "error", "value": "{{ $error.message }}" },
          { "call": "$message.error", "args": ["加载失败"] }
        ],
        "finally": [
          { "set": "loading", "value": false }
        ]
      }
    ]
  }
}

基于 MIT 许可发布