项目级的vue3封装axios请求接口要怎么做?

开门见山

在根目录创建一个api文件夹,在api文件夹下创建一个名为service.js的文件,用来进行axios封装。

在这里插入图片描述

1.既然要封装axios,首先就要下载axios插件库

npm install axios

2.引入了axios后,现在正式开始对它进行封装了。

service.js中

import axios from 'axios'
//创建请求函数
 function request(config) {
    // 创建一个名为instance的axios实例
    const instance = axios.create({
        // 配置请求地址
        baseURL: import.meta.env.VITE_APP_API_BASEURL,
        // 设置超时时间
        timeout: 5000,
    })
    return instance(config)
}

这里的instance就是axios的实例,后面要对它进行许多操作

3 .继续进行操作:配置请求头

根据需要进行配置

instance.interceptors.request.use((config) => {
        // 配置请求头
        if (userStore.isLogin && !request.removeAuth) {
            request.headers['Authorization'] = userStore.token
        }
        return config
    })

一般情况请求后端接口要跟上一个token。有的使用到的是Authorization、有的是bear、根据需求进行修改。

4 . 对返回结果进行拦截(拦截response)

	instance.interceptors.response.use(
        (response) => {
            const dataAxios = response.data
            const { code, data } = dataAxios
            // 目前和后端口头约定是字符串,以防万一强制转字符串
            switch (`${code}`) {
                // code === 200 | 2 代表没有错误
                case '200':
                case '2':
                    return data
                // code === 400001004 代表token 过期打回登录页
                case '40001':
                    throttleToLogin()
                    break
                case '40002':
                case '40003':
                    // 不是正确的 code
                    return requestError(response)
                default:
                    // 不是正确的 code
                    return requestError(response)
            }
        },
        (error) => {
        	// 这里的这个get用到的是lodash-es,用来获取error.response.status的,如果没有这个key的话就是undefined
        	// httpLogError:记录错误日志的一个方法
            const status = get(error, 'response.status')
            switch (status) {
                case undefined:
                case null:
                    httpLogError(error, '网路错误或请求跨域')
                    break;
                case 400:
                    httpLogError(error, '请求错误')
                    break;
                case 404:
          			httpLogError(error, `请求地址出错: ${error.response.config.url}`);
          			break;
        		default:
          			httpLogError(error, "请求错误");
          			break;
            }
            ElMessage({
        		message: error.message,
        		type: 'error'
      		})
      		return Promise.reject(error)
        }
    )

当请求结果返回的时候做了这些处理:

  1. dataAxios接受返回结果中的data(这里的data还是要根据后端给你的结构去灵活修改)
  2. 结构拿出来dataAxios中的codedata (同上)(注意:这里的code也是和后端约定校验规则的)
  3. switch去判断code,只有在code2002的时候 返回data(仍然注意code也是约定的, 我这里的2002也是和后端商量好后写上去的)
  4. 其他情况的话 执行requestError方法进行错误处理
  5. catch里进行错误处理,根据返回的code或者错误码进行错误处理
  6. 最后进行返回reject,以便以后在api请求中的catch中查看问题。

5.锦上添花 requestError

function requestError(response) {
  return new Promise((_, reject) => {
    const { data } = response;
    const msg = __DEV__ ? `api请求出错 ${response.config.url}` : data.msg;
    ElMessage({
      message: msg,
      type: "error",
    });
    reject(data);
  });
}
  1. 返回一个 Promise 对象。
  2. 从响应对象中获取错误信息。
  3. 根据开发环境的设置生成不同的错误提示信息。
  4. 使用消息组件显示错误提示。
  5. 将错误信息传递给调用方进行进一步处理。(也可以不传,就当一个提示)

6. 文件内容:

// service.js
import axios from "axios";
import { ElMessage } from "element-plus";
import { userStore } from "@/stores/user.js";

function requestError(response) {
  return new Promise((_, reject) => {
    const { data } = response;
    const msg = __DEV__ ? `api请求出错 ${response.config.url}` : data.msg;
    ElMessage({
      message: msg,
      type: "error",
    });
    reject(data);
  });
}

export function request(config) {
  // 设置请求配置
  const instance = axios.create({
    baseURL: import.meta.env.VITE_APP_API_BASEURL,
    timeout: 5000,
  });

  instance.interceptors.request.use((config) => {
    // 配置请求头
    const userData = userStore();
    if (userStore.isLogin && !request.removeAuth) {
      request.headers["Authorization"] = userStore.token;
    }
    return config;
  });

  instance.interceptors.response.use(
    (response) => {
      const dataAxios = response.data;
      const { code, data } = dataAxios;
      // 目前和公司后端口头约定是字符串,以防万一强制转字符串
      switch (`${code}`) {
        // code === 200 | 2 代表没有错误
        case "200":
        case "2":
          return data;
        // code === 400001004 代表token 过期打回登录页
        case "400001":
        // 打回登录页等方法,要根据情况修改
          throttleToLogin();
          break;
        case "400002":
        case "400003":
          // 不是正确的 code
          return requestError(response);
        default:
          // 不是正确的 code
          return requestError(response);
      }
    },
    (error) => {
      const status = get(error, "response.status");
      switch (status) {
        // TODO 再考虑下怎么判断是跨域问题
        case undefined:
        case null:
          httpLogError(error, "网路错误或请求跨域");
          break;
        case 400:
          httpLogError(error, "请求错误");
          break;
        case 401:
          httpLogError(error, "未授权,请登录");
          break;
        case 403:
          httpLogError(error, "拒绝访问");
          break;
        case 404:
          httpLogError(error, `请求地址出错: ${error.response.config.url}`);
          break;
        default:
          httpLogError(error, "请求错误");
          break;
      }
      ElMessage({
        message: error.message,
        type: "error",
      });
      return Promise.reject(error);
    }
  );
  return instance(config);
}

一定要根据需求去修改:比如tokenuserStore 等等

下一篇会讲如何自动化导入api,模块化封装api

有帮助到点赞加关注喔 CV人生不迷路 分享更多的前端知识

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个简单的Vue2封装Axios接口请求的示例代码: 1. 安装Axios ``` npm install axios --save ``` 2. 创建一个Api.js文件,在其中封装Axios请求 ``` import axios from 'axios' // 创建一个axios实例 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 // 请求超时时间 }) // 请求拦截器 service.interceptors.request.use( config => { // 在请求发送之前一些处理,例如添加token等等 return config }, error => { console.log(error) return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( response => { // 在响应之后一些处理 const res = response.data if (res.code !== 200) { console.log(res.msg) return Promise.reject(res) } else { return res } }, error => { console.log(error) return Promise.reject(error) } ) // 封装get请求 export function get(url, params) { return service({ url: url, method: 'get', params: params }) } // 封装post请求 export function post(url, data) { return service({ url: url, method: 'post', data: data }) } ``` 3. 在Vue组件中使用Api.js中的方法 ``` import { get, post } from '@/api/Api.js' export default { name: 'Example', methods: { // get请求示例 async getUserInfo() { try { const res = await get('/user/info', { id: 1 }) console.log(res) } catch (error) { console.log(error) } }, // post请求示例 async login() { try { const res = await post('/user/login', { username: 'admin', password: '123456' }) console.log(res) } catch (error) { console.log(error) } } } } ``` 以上就是一个简单的Vue2封装Axios接口请求的示例代码,希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值