Axios - 基于 Vue + Element 请求封装

╰+攻爆jí腚メ 2022-10-16 01:55 404阅读 0赞

前言

当然,其他 ReactUI 框架可作为参考。

本文基于 Axios 请求库,封装全局能通过 this(挂载到Vue实例上) 全局调用的请求(非集中式 API 管理模式 )。

其中,包含以下功能:

  • baseURL
  • 超时时间
  • headers
  • 开发环境切换
  • 请求结果处理

    // 最终全局调用方式(以POST请求为例)
    // 只需关心调用成功(状态码正确)处理
    this.$post(‘v1/user_admin/login’,
    { phone: ‘13191835102’, password: ‘wjb20’ })
    .then((response) => {

    1. console.log(response)

    })

一、安装 Axios

这里不多做介绍

  1. npm install axios

二、新建 http.js

src 下新建一个 utils 文件夹,创建 http.js 文件,命名无所谓。

该示例只封装了 POST 请求,其他请求类似。

在该文件中,写入以下代码,请根据 路径及命名 随机应变。

  1. // axios
  2. import axios from 'axios'
  3. // 引入路由(对异常状态码做出跳转页面处理)
  4. // 例如 [登录已过期]: 拦截到后跳转到登录页面
  5. import router from '../router/index'
  6. // 引入 elementui 提示框组件(根据你的UI框架来)
  7. // 例如 [登录已过期]: 需要给用户弹出提示框来告知用户
  8. import { Message, MessageBox } from 'element-ui'
  9. // 获取token/uid(一般都会在请求携带token/uid等信息)
  10. // [如果你的服务端接口没有做这件事那不需要]
  11. var token = localStorage.getItem('token')
  12. var uid = localStorage.getItem('uid')
  13. // 开发环境切换(基本分为开发环境与线上环境)
  14. // 用一个标识很轻松就能切换服务器接口地址
  15. var debug = true//标识
  16. var baseURL//baseURL
  17. if(!debug) {
  18. baseURL = 'https://api.xxx.com/'//线上接口
  19. }else{
  20. baseURL = 'https://dev.xxx.com/'//线下接口
  21. }
  22. // 配置请求基本信息(详见文档 | 这里只做了简单的配置)
  23. // baseurl / 超时时间(5秒) /
  24. axios.defaults.baseURL = baseURL
  25. axios.defaults.timeout = 7000
  26. /** * POST - 请求封装 * @param url * @param data * @returns Promise */
  27. export function post(url, data = { }){
  28. // headers(携带token)
  29. axios.defaults.headers.common['token'] = token
  30. // data 公共参数设置(例如token)
  31. // 如果你的服务端接口没有规定则不需要以下操作
  32. // [每次请求接口 data 数据必须携带的参数]
  33. // data.uid = uid
  34. // data.token = token
  35. // data.model = 'Browser'
  36. // data.platform = 'H5'
  37. return new Promise((resolve, reject) => {
  38. axios.post(url, data)
  39. // 请求成功回调
  40. .then(response => {
  41. // 拿到结果先对状态码进行对应处理(调用下方函数)
  42. // 传入状态码给处理函数即可(code)
  43. serveCode(response.data.code)
  44. // ok(正常返回)
  45. resolve(response.data);
  46. },
  47. // 请求失败回调
  48. err => {
  49. // 请求失败后(做一个弹出框提示用户)
  50. // 当然也可以做其他操作
  51. Message({
  52. showClose: true,
  53. duration: '10000',
  54. message: '请求失败(可能是网络问题)',
  55. type: 'error'
  56. })
  57. reject(err)
  58. })
  59. })
  60. }
  61. /** * GET - 请求封装(与POST请求一样 | axios.get) * @param url * @param data * @returns Promise */
  62. // ...
  63. /** * DELETE - 请求封装(与POST请求一样 | axios.delete) * @param url * @param data * @returns Promise */
  64. // ...
  65. /** * 状态码处理 * @param {Number} code - 状态码 * @return void */
  66. function serveCode(code) {
  67. switch(code){
  68. // 无权限访问,请尝试重新登录
  69. case 1001 :
  70. // elementUI 提示框
  71. MessageBox.alert('为了您的账号安全,请重新登录系统', '登录已过期', {
  72. type: 'error',
  73. confirmButtonText: '我知道了',
  74. showClose: false,
  75. center: true
  76. })
  77. // 用户点击确认框
  78. .then(() => {
  79. // 做一些事情...
  80. // 例如登录已经过期了(清除缓存)
  81. // localStorage.removeItem('token')
  82. // localStorage.removeItem('uid')
  83. // 最后跳转到登录页
  84. // router.push('/login')
  85. })
  86. break;
  87. // 其他状态码情况处理
  88. // ...
  89. }
  90. }

三、挂载到 Vue 实例

该步骤会获得全局 this 调用请求。

打开根目录下的 main.js ,加入以下代码:

  1. // 引入封装好的请求(注意路径)
  2. import { post } from './utils/http'
  3. // 如果存在多个请求封装则以下方式引入
  4. // import { post, get } from './utils/http'
  5. // 挂载到 Vue 实例
  6. Vue.prototype.$post = post
  7. // 如果存在多个请求封装则以下方式挂载
  8. // [或者: 将这些零散的请求归类在一个对象上访问]
  9. // [例如: this.$http.post() | this.$http.get()]
  10. // Vue.prototype.$post = post
  11. // Vue.prototype.$get = get

四、使用方法

  1. this.$post('v1/user_admin/login',
  2. { phone: '13191835102', password: 'wjb20' })
  3. .then((response) => {
  4. console.log(response)
  5. })

五、写在后面

你无需考虑,接口返回数据不正常的情况(因为出现状态码不正常的情况下会自动做出处理),当然也没有配置拦截器,主要以简洁为主。

其他示例:

  1. import axios from 'axios'
  2. // import qs from 'qs'//序列化post类型数据
  3. // router
  4. import router from '../router/index'
  5. // alert
  6. import { Message, MessageBox } from 'element-ui'
  7. // data加密函数
  8. import { createSign } from '../lib/createSign'
  9. // 环境切换
  10. var debug = true//标识
  11. var baseURL//baseURL
  12. if(debug) {
  13. // baseURL = 'http://192.168.124.169:8080/'// 线上
  14. // baseURL = 'http://192.168.124.7:8080/'// 线上
  15. baseURL = "https://iot.lkxdiot.com/"
  16. }else{
  17. // baseURL = 'http://192.168.124.7:8080/'// 线上
  18. baseURL = 'https://api.lkxdiot.com/'// 线下
  19. // baseURL = "http://192.168.124.7:8080" //
  20. }
  21. // baseurl / 超时时间(5秒) / headers(携带token)
  22. axios.defaults.baseURL = baseURL
  23. axios.defaults.timeout = 7000
  24. /** * 封装post请求 * @author 王佳斌 * @param url * @param data * @returns {Promise} */
  25. export function post(url, data = { }, isExport = { }){
  26. // 设置头
  27. axios.defaults.headers.common['token'] = localStorage.getItem('token')
  28. // 设置token
  29. data.token = localStorage.getItem('token')
  30. // 设置uid
  31. data.uid = localStorage.getItem('uid')
  32. // 设置level
  33. data.level = localStorage.getItem('level')
  34. data.model = "Browser"
  35. data.platform = 'H5'
  36. data.company_id = localStorage.getItem('company_id')
  37. // 判断token是否为空
  38. if(localStorage.getItem('token') != '')
  39. {
  40. data = createSign(localStorage.getItem('token'), data)
  41. }
  42. return new Promise((resolve, reject) => {
  43. axios.post(url, data,isExport)
  44. // success
  45. .then(response => {
  46. // 根据状态码进行对应处理
  47. serveCode(response.data.code)
  48. // ok
  49. resolve(response.data);
  50. },
  51. // error
  52. err => {
  53. Message({
  54. showClose: true,
  55. duration: '10000',
  56. message: '通信失败(可能是网络问题)',
  57. type: 'error'
  58. })
  59. reject(err)
  60. })
  61. })
  62. }
  63. /** * 服务器返回-状态码处理 * @author 王佳斌 * @param {Number} code - 状态码 * @return void */
  64. function serveCode(code) {
  65. switch(code){
  66. // 无权限访问,请尝试重新登录
  67. case 1001 :
  68. MessageBox.alert('为了您的账号安全,请重新登录系统', '登录已过期', {
  69. type: 'error',
  70. confirmButtonText: '我知道了',
  71. showClose: false,
  72. center: true
  73. }).then(() => {
  74. // 清除缓存(token/uid)
  75. localStorage.removeItem('token')
  76. localStorage.removeItem('uid')
  77. // 跳转到登录页
  78. router.push('/login')
  79. })
  80. break;
  81. }
  82. }

发表评论

表情:
评论列表 (有 0 条评论,404人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue中统一封装Axios请求

    1.Axios 是什么,为什么要统一封装? axios是一个基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的特性,例如统一进行拦截请...

    相关 vue-封装axios请求

    最近接手新的vue项目,发现axios竟然没有封装,立马动手封装,这里记录一下完整的封装过程,废话不说,直接上代码 baseConfig.js文件 //存放各个服