• VUE3项目学习系列--Axios二次封装(五)


    Axios中文文档 | Axios中文网 (axios-http.cn)

    Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。在项目中进行二次封装的主要目的是为了使用其请求与响应的拦截处理。

    1、依赖安装

    pnpm install axios

    2、配置

    在src根目录下创建utils/request.ts,详细配置参考axios官网

    1. // 进行axios二次封装,使用请求与响应拦截器
    2. import axios from 'axios'
    3. import { ElMessage } from 'element-plus'
    4. // 1、创建axios实例
    5. const instance = axios.create({
    6. baseURL: import.meta.env.VITE_APP_BASE_API,
    7. timeout: 1000,
    8. headers: { 'X-Custom-Header': 'foobar' }
    9. });
    10. // 2、添加请求拦截器
    11. instance.interceptors.request.use(function (config) {
    12. // 在发送请求之前做些什么
    13. return config;
    14. }, function (error) {
    15. // 对请求错误做些什么
    16. return Promise.reject(error);
    17. });
    18. // 3、添加响应拦截器
    19. instance.interceptors.response.use(function (response) {
    20. // 2xx 范围内的状态码都会触发该函数。
    21. // 对响应数据做点什么
    22. return response.data;
    23. }, function (error) {
    24. let message = '';
    25. let status = error.response.status;
    26. // 超出 2xx 范围的状态码都会触发该函数。
    27. // 对响应错误做点什么
    28. switch (status) {
    29. case 401:
    30. message = "TOKEN过期";
    31. break;
    32. case 403:
    33. message = "无权访问";
    34. break;
    35. case 404:
    36. message = "请求地址错误";
    37. break;
    38. case 500:
    39. message = "服务器异常";
    40. break;
    41. default:
    42. message = "网络异常"
    43. }
    44. // 错误提示
    45. ElMessage({
    46. type:'error',
    47. message
    48. });
    49. return Promise.reject(error);
    50. });
    51. // 对外暴露axios
    52. export default instance;

    3、使用

    在App.vue中的script下使用封装的接口进行请求测试,接口使用mock模拟接口,mock使用看彩蛋部分。

    1. // 使用axios封装接口
    2. import request from '@/utils/request'
    3. import { onMounted } from 'vue'
    4. // 在组件挂在完后测试发送请求
    5. onMounted(() => {
    6. request({
    7. url: '/user/login',
    8. method: 'post',
    9. data: {
    10. username: 'admin',
    11. password: '123456'
    12. }
    13. }).then(res => {
    14. console.log(res);
    15. })
    16. })

    4、彩蛋Mock接口使用

    (1)安装依赖

    pnpm install -D vite-plugin-mock mockjs

    (2)配置mock

    在vite.config.ts中配置文件启用插件,注意引用mock插件需要调整defineconfig方法结构

     mock 版本低与3.0时使用localEnabled:command === 'serve',否则: enable: command === 'serve'

    1. import { defineConfig } from 'vite'
    2. import vue from '@vitejs/plugin-vue'
    3. import path from 'path'
    4. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'// 引入svg
    5. import { viteMockServe } from 'vite-plugin-mock'//mock提供插件方法
    6. // https://vitejs.dev/config/
    7. export default defineConfig(({ command }) => {
    8. return {
    9. plugins: [
    10. vue(),
    11. // 创建svg插件
    12. createSvgIconsPlugin({
    13. iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
    14. symbolId: 'icon-[dir]-[name]',
    15. }),
    16. // 创建mock插件
    17. viteMockServe({
    18. enable: command === 'serve'
    19. }),
    20. ],
    21. resolve: { alias: { '@': path.resolve('./src') } },
    22. // scss全局变量配置
    23. css: {
    24. preprocessorOptions: {
    25. scss: {
    26. javascriptEnabled: true,
    27. additionalData: '@import "./src/styles/variable.scss";',
    28. },
    29. },
    30. },
    31. }
    32. })

    (3)创建mock接口,在根目录下创建mock/user.ts

    1. function createUserList() {
    2. return [
    3. {
    4. userId: 1,
    5. avatar:
    6. 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
    7. username: 'admin',
    8. password: '123456',
    9. desc: '平台管理员',
    10. roles: ['平台管理员'],
    11. buttons: ['cuser.detail'],
    12. routes: ['home'],
    13. token: 'Admin Token',
    14. },
    15. {
    16. userId: 2,
    17. avatar:
    18. 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
    19. username: 'system',
    20. password: '123456',
    21. desc: '系统管理员',
    22. roles: ['系统管理员'],
    23. buttons: ['cuser.detail', 'cuser.user'],
    24. routes: ['home'],
    25. token: 'System Token',
    26. },
    27. ]
    28. }
    29. export default [
    30. // 用户登录接口
    31. {
    32. url: '/api/user/login', //请求地址
    33. method: 'post', //请求方式
    34. response: ({ body }) => {
    35. //获取请求体携带过来的用户名与密码
    36. const { username, password } = body
    37. //调用获取用户信息函数,用于判断是否有此用户
    38. const checkUser = createUserList().find(
    39. (item) => item.username === username && item.password === password,
    40. )
    41. //没有用户返回失败信息
    42. if (!checkUser) {
    43. return { code: 201, data: { message: '账号或者密码不正确' } }
    44. }
    45. //如果有返回成功信息
    46. const { token } = checkUser
    47. return { code: 200, data: { token } }
    48. },
    49. },
    50. // 获取用户信息
    51. {
    52. url: '/api/user/info',
    53. method: 'get',
    54. response: (request) => {
    55. //获取请求头携带token
    56. const token = request.headers.token
    57. //查看用户信息是否包含有次token用户
    58. const checkUser = createUserList().find((item) => item.token === token)
    59. //没有返回失败的信息
    60. if (!checkUser) {
    61. return { code: 201, data: { message: '获取用户信息失败' } }
    62. }
    63. //如果有返回成功信息
    64. return { code: 200, data: { checkUser } }
    65. },
    66. },
    67. ]

    (4)测试使用,main.ts中添加如下代码

    1. // 4、测试mock接口
    2. import axios from 'axios'
    3. axios({
    4. url:'/api/user/login',
    5. method:"post",
    6. data:{
    7. username:'admin',
    8. passwork:'123456'
    9. }
    10. })

  • 相关阅读:
    Linux运维面试题总结—Linux基础、计算机网络基础
    (附源码)spring boot宠物医院管理系统 毕业设计 180923
    JVM-5
    20_rewrite 模块
    Docker-harbor私有仓库部署与管理
    [开源]企业级在线办公系统,基于实时音视频完成在线视频会议功能
    英国2.8万的A-Level学生拿不到offer
    微服务:Sentinel篇
    3.9-Dockerfile实战
    3D数学之三角公式
  • 原文地址:https://blog.csdn.net/CONSOLE11/article/details/136611186