@umijs/max 中导出的 request 方法,如何实现 GET/POST/PUT/DELETE 这四种核心请求

一、基础使用前提

@umijs/max 内置了 request 能力(基于 umi-request 封装),无需额外安装依赖,直接导入即可使用。

二、四种请求的完整示例

1. 基础配置(推荐全局统一配置)

先在项目中创建 src/utils/request.ts 做全局配置,避免重复代码:

typescript

运行

javascript 复制代码
import { request } from '@umijs/max';

// 全局默认配置
request.defaults.baseURL = 'https://api.example.com'; // 接口基础地址
request.defaults.timeout = 10000; // 超时时间(10秒)
request.defaults.credentials = 'include'; // 携带Cookie(跨域请求需后端配合)

// 请求拦截器:统一添加token、处理请求参数
request.interceptors.request.use((url, options) => {
  return {
    url,
    options: {
      ...options,
      headers: {
        ...options.headers,
        'Authorization': `Bearer ${localStorage.getItem('token') || ''}`, // 统一加token
        'Content-Type': 'application/json', // 默认JSON格式
      },
    },
  };
});

// 响应拦截器:统一处理返回结果、错误
request.interceptors.response.use(
  async (response) => {
    const data = await response.clone().json(); // 克隆响应,避免重复读取
    // 统一处理业务错误码
    if (data.code !== 200) {
      // 示例:登录失效跳转登录页
      if (data.code === 401) {
        localStorage.removeItem('token');
        window.location.href = '/login';
        return Promise.reject(new Error('登录失效,请重新登录'));
      }
      return Promise.reject(new Error(data.message || '请求失败'));
    }
    return data; // 直接返回解析后的JSON数据,无需每次手动json()
  },
  (error) => {
    // 统一捕获网络错误/HTTP错误
    console.error('请求异常:', error);
    return Promise.reject(error);
  }
);

export default request;

2. 四种请求的具体使用

在业务组件 / 接口文件中(如 src/services/api.ts)调用:

typescript

运行

typescript 复制代码
import request from '@/utils/request';

// ====================== GET 请求(查询数据)======================
/**
 * 获取列表数据
 * @param params - 查询参数(自动拼接到URL后)
 */
export async function getList(params?: { id?: string; name?: string }) {
  // 方式1:链式调用(推荐,语义更清晰)
  return request.get('/api/list', { params });
  // 方式2:基础调用(等价写法)
  // return request('/api/list', { method: 'GET', params });
}

// ====================== POST 请求(创建数据)======================
/**
 * 新增数据
 * @param data - 提交的表单/JSON数据
 */
export async function addData(data: { name: string; age: number }) {
  // 方式1:链式调用
  return request.post('/api/data', { data });
  // 方式2:基础调用
  // return request('/api/data', { method: 'POST', data });
}

// ====================== PUT 请求(更新数据)======================
/**
 * 更新数据
 * @param id - 要更新的ID
 * @param data - 要更新的内容
 */
export async function updateData(id: string, data: { age: number }) {
  // 方式1:链式调用
  return request.put(`/api/data/${id}`, { data });
  // 方式2:基础调用
  // return request(`/api/data/${id}`, { method: 'PUT', data });
}

// ====================== DELETE 请求(删除数据)======================
/**
 * 删除数据
 * @param id - 要删除的ID
 */
export async function deleteData(id: string) {
  // 方式1:链式调用
  return request.delete(`/api/data/${id}`);
  // 方式2:基础调用(带参数的场景)
  // return request(`/api/data/${id}`, { 
  //   method: 'DELETE', 
  //   params: { reason: '手动删除' } // 可选:删除时携带额外参数
  // });
}

// ====================== 业务组件中调用示例 ======================
// 比如在 React 组件中
// import { getList, addData } from '@/services/api';

// const fetchList = async () => {
//   try {
//     const res = await getList({ id: '123', name: 'test' });
//     console.log('列表数据:', res);
//   } catch (err) {
//     console.error('获取列表失败:', err);
//   }
// };

// const handleAdd = async () => {
//   try {
//     const res = await addData({ name: '张三', age: 25 });
//     console.log('新增成功:', res);
//   } catch (err) {
//     console.error('新增失败:', err);
//   }
// };

三、关键配置项说明

配置项 作用 常用值
params GET 请求的参数(自动拼接为 ?key=value) { id: 1, name: 'test' }
data POST/PUT/DELETE 请求的请求体数据(自动序列化为 JSON) { name: '张三', age: 25 }
headers 单个请求的自定义请求头(覆盖全局配置) { 'Content-Type': 'form-data' }
timeout 单个请求的超时时间(覆盖全局配置) 5000(5 秒)
responseType 响应数据类型(默认 json) json/text/blob(文件下载)

四、特殊场景补充

1. POST 提交表单数据(form-data)

typescript

运行

javascript 复制代码
export async function uploadFile(formData: FormData) {
  return request.post('/api/upload', {
    data: formData,
    headers: {
      'Content-Type': 'multipart/form-data', // 必须指定
    },
  });
}

2. DELETE 请求携带请求体

typescript

运行

javascript 复制代码
export async function batchDelete(data: { ids: string[] }) {
  return request.delete('/api/batch-delete', { data });
}

总结

  1. @umijs/max 的 request 支持 get/post/put/delete 链式调用,语义清晰,是推荐写法;
  2. 全局配置拦截器可统一处理 token、错误码、Cookie 等,减少重复逻辑;
  3. GET 请求用 params 传参(自动拼 URL),POST/PUT/DELETE 用 data 传请求体(自动序列化 JSON)。
相关推荐
hkNaruto2 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏
IT_陈寒2 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
Acro2 小时前
快给macOS 上的Grok Bot换一套皮肤
前端
flash俊杰2 小时前
双引擎 OCR 编排:逐页判定、视觉优先、partial 语义与三层超时
前端
计算机魔术师2 小时前
Reddit 每周被 Google 偷走 100 万次点击,CEO 摊牌了
前端
前端繁华如梦2 小时前
用 React Three Fiber 做一栋能编辑的教学楼数字孪生
前端
前端繁华如梦2 小时前
用 React Three Fiber 做一套智慧医院数字孪生:编辑器、大屏和 BIM 浏览器
前端
俊昭喜喜里4 小时前
理解全局跨域CORS配置
前端
锋行天下6 小时前
DeepSeek写Langgraph就是个大傻逼,一本正经胡说八道
前端·人工智能·后端
jktantan7 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript