axios adapter——统一请求封装、添加前缀

通过封装adapterRequest和moduleRequest函数,可以使代码更加简洁和可读性更强。同时也能够方便地处理不同类型的请求方式,并且可以轻松地为每个模块添加统一的前缀。
相比按需引入

  1. 可以少写很多模板配置代码,新的业务模块只需要改一个前缀就行了。
  2. 支持相同的参数使用多种请求方法。
  3. 只需要引入一次,之后直接xxxAPI.xxx就可以利用代码提示了。
  4. 多引入的体积几乎可以忽略不计。
  5. 依然保留了高度的灵活性。

代码

import request from '@/utils/request';
import qs from 'qs';

// 适配器, 用于适配不同的请求方式
const adapterRequest = (url, value = {}, method = 'post', options = {}) => {
  if (method === 'post') {
    return request.post(url, value, options);
  } else if (method === 'get') {
    return request.get(url, { params: value, ...options });
  } else if (method === 'formdata') {
    // form-data表单提交的方式
    return request.post(url, qs.stringify(value), {
      headers: {
        'Content-Type': 'multipart/form-data',
      },
      ...options,
    });
  } else {
    // 其他请求方式,例如:put、delete
    return request({
      method: method,
      url: url,
      data: value,
      ...options,
    });
  }
};

// 模块内的请求, 会自动加上模块的前缀
export const moduleRequest =
  (moduleUrl) =>
    (url, ...arg) => {
      return adapterRequest(moduleUrl + url, ...arg);
    };

export default adapterRequest;

使用案例


import { moduleRequest } from './baseRequest';

const request = moduleRequest('/GIFT-ENTERPRISE/enterprise/');

export default {
  page(data) {
    return request('page', data);
  },
  add(data) {
    return request('insert', data);
  },
  edit(data) {
    return request('update', data);
  },
  delete(data) {
    return request('del', data);
  },
  detail(data) {
    return request('get', data, 'get');
  },
  export(data) {
    return request('export', data, 'post', {
      responseType: 'blob',
    });
  },
  import(data) {
    return request('import', data);
  },
};

这部分代码的优点包括:

  1. 统一前缀:通过调用moduleRequest(‘/GIFT-CONSULT/category/’)生成的request对象,可以自动为所有API请求加上模块前缀,这样在多个模块中使用时可以避免URL重复,提高了程序的可维护性。

  2. 便于增删改查:通过将不同类型的请求封装成对应的方法(page、add、list、edit和delete),代码更加清晰易读,同时也方便了后续的增删改查操作。

  3. 具备灵活性:adapterRequest函数支持不同类型的请求方式,例如get、post、form-data等,能够适应大部分请求场景。而且,由于request对象是通过moduleRequest函数生成的,所以它的前缀可以与项目实际情况相适应,具有更好的灵活性和可扩展性。

这段代码通过模块化的设计思想和常见的HTTP请求封装方法,使得开发人员可以更加轻松地进行前端API请求和管理,提升了代码的可读性和可维护性,同时也有利于提高开发效率。

业务中使用

在这里插入图片描述

灵活调用

import companyAPI from ‘@/api/company’;

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Vue项目中,我们通常会使用axios来发送请求。为了方便管理和维护代码,我们可以将axios请求进行统一封装。 首先,我们需要在项目中安装axios: ``` npm install axios --save ``` 然后,我们可以在src目录下新建一个api目录,用来存放所有的接口请求。在api目录下,我们可以新建一个request.js文件,用来封装axios请求: ``` import axios from 'axios'; // 创建axios实例 const service = axios.create({ baseURL: process.env.BASE_API, // api的base_url timeout: 5000 // 请求超时时间 }); // request拦截器 service.interceptors.request.use(config => { // 在请求发送之前做一些处理 return config; }, error => { // 处理请求错误 console.log(error); Promise.reject(error); }) // respone拦截器 service.interceptors.response.use( response => { // 在接收响应做一些处理,例如统一的错误处理 return response.data; }, error => { console.log('err' + error);// for debug return Promise.reject(error); } ) export default service; ``` 这里我们创建了一个axios实例,并进行了一些配置,例如设置请求超时时间、拦截请求和响应等。并且将其导出,其他地方可以直接引用该实例进行请求。 接下来,我们可以在api目录下新建一个模块,例如user.js,用来存放用户相关的接口请求。在user.js中,我们可以这样写: ``` import request from '@/api/request'; export function login(username, password) { return request({ url: '/user/login', method: 'post', data: { username, password } }) } export function getInfo(token) { return request({ url: '/user/info', method: 'get', params: { token } }) } ``` 这里我们引入了之前封装axios实例,然后对外导出两个方法login和getInfo,分别用来请求登录和获取用户信息的接口。 最后,我们可以在Vue组件中使用这些接口,例如: ``` import { login, getInfo } from '@/api/user'; export default { name: 'Login', methods: { handleLogin() { login(this.username, this.password).then(response => { // 处理登录成功的逻辑 getInfo(response.token).then(info => { // 处理获取用户信息成功的逻辑 }) }) } } } ``` 这里我们引入了之前定义的login和getInfo方法,并在handleLogin方法中调用它们。需要注意的是,我们在处理登录成功后,还调用了getInfo方法来获取用户信息。这里我们可以看到,我们可以将多个请求串联起来进行处理。 在实际开发中,我们经常会遇到重复请求的问题,例如多次点击提交按钮或者页面切换时进行数据加载等。为了避免重复请求,我们可以对axios进行进一步封装,例如: ``` import axios from 'axios'; // 定义一个空的数组,用来存储每个请求的取消函数和标识 const pending = []; const CancelToken = axios.CancelToken; const removePending = (config) => { for (let i = 0; i < pending.length; i++) { if (pending[i].url === config.url + '&' + config.method) { pending[i].cancel(); // 取消重复请求 pending.splice(i, 1); // 删除已经取消的请求记录 } } } // 创建axios实例 const service = axios.create({ baseURL: process.env.BASE_API, // api的base_url timeout: 5000 // 请求超时时间 }); // request拦截器 service.interceptors.request.use(config => { // 在请求发送之前做一些处理 removePending(config); config.cancelToken = new CancelToken((c) => { pending.push({ url: config.url + '&' + config.method, cancel: c }); }); return config; }, error => { // 处理请求错误 console.log(error); Promise.reject(error); }) // respone拦截器 service.interceptors.response.use( response => { // 在接收响应做一些处理,例如统一的错误处理 removePending(response.config); return response.data; }, error => { console.log('err' + error);// for debug return Promise.reject(error); } ) export default service; ``` 这里我们定义了一个pending数组,用来存储每个请求的取消函数和标识。在每次请求发送之前,我们会先调用removePending函数,用来取消重复请求。在每次请求完成之后,我们会再次调用removePending函数,用来删除已经取消的请求记录。这样就可以避免重复请求的问题了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值