axios的请求封装

╰+哭是因爲堅強的太久メ 2022-12-18 08:58 337阅读 0赞
  1. 参考一

    import axios from ‘axios’
    import qs from ‘qs’
    import store from ‘../store/index’
    import { MessageBox } from ‘element-ui’

    / 一、request: 1. 说明:封装对后台的请求,可以选择自动处理一些异常。 2. 参数: - url: 后台地址,必填,String,如:”/user/add” - params: 请求参数,选填,Object,,默认值:{} - config: axios参数,选填,Object,默认值:{} - autoErrorRes: 是否自动处理响应错误,选填,Boolean,默认值:true - autoErrorData:是否自动处理后台错误,选填,Boolean,默认值:true - autoCancel: 离开路由时是否自动取消请求,选填,Boolean,默认值:true 3. 返回: - 成功:Promise.resolve(请求成功后的结果:response.data) - 失败: - 请求异常:Promise.reject(http响应错误) - 请求失败:Promise.reject(请求失败后的结果:response.data) 4. 约定后台返回数据格式: response.data = { “code”: 0, // 成功/失败标识,0=成功,1=失败 “data”: {}, // 成功时可选参数,请求的响应数据 “message”: “用户名字重复” // 失败时必需参数,错误提示 } 二、sessionRequest: 1. 说明:利用sessionStorage缓存请求,可以选择outTime,其他同request。 2. 参数: - outTime:距离上次请求多少秒后需要重新请求,选填,Integer,小于0表示不重新请求,默认值:-1 三、localRequest: 1. 说明:利用localStorage缓存请求,可以选择outTime,其他同request。 2. 参数: - outTime:距离上次请求多少秒后需要重新请求,选填,Integer,小于0表示不重新请求,默认值:604800(一周) **/

    //将格式设置为formdata
    axios.defaults.headers.post[‘Content-Type’] = ‘application/x-www-form-urlencoded’;
    axios.defaults.headers.get[‘Content-Type’] = ‘application/x-www-form-urlencoded’;
    axios.defaults.transformRequest = [function (data) {

    1. let ret = ''
    2. for (let it in data) {
    3. ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
    4. }
    5. return ret

    }]

    const axiosCustom = axios.create({
    baseURL: process.env.VUE_APP_BASE_AXIOS,
    //是否携带cookie-跨域时无法携带cookie
    withCredentials: false,
    timeout: 20000
    })

    //jwt验证,每次发给服务器的所有请求头部都加入token
    axiosCustom.interceptors.request.use(function (config) {
    config.headers.token = localStorage.getItem(‘user-token’)
    return config
    })

    / 普通请求 /
    export const request = (url,params = { },methods=’post’, config = { }, autoErrorRes = true, autoErrorData = true, autoCancel = true) => {
    if (autoCancel) {

    1. config = Object.assign({ cancelToken: store.state.source.token }, config)

    }
    const args = Object.assign({

    1. 'method': methods,
    2. 'url': url,
    3. 'data': params

    }, config)
    if (![‘put’, ‘post’, ‘patch’].includes(args.method.toLowerCase())) {

    1. args['params'] = args['params'] || args['data']
    2. args['paramsSerializer'] = args['paramsSerializer'] || function (params) {
    3. return qs.stringify(params, { arrayFormat: 'indices' })
    4. }

    }

  1. return axiosCustom(args).then((res) => {
  2. // 未登录=login:type
  3. if (res.data.data === 'login') {
  4. return Promise.reject('nologin')
  5. }
  6. if (autoErrorData && res.data.hasOwnProperty('code') && res.data.code !=="0") {
  7. /*const errMsg = res.data.msg || '未知的服务器错误,请联系管理员!'*/
  8. return Promise.reject(res.data.msg)
  9. }
  10. return res.data
  11. }, (error) => {
  12. // 自动处理网络请求错误
  13. console.error(error)
  14. error.response = error.response || { }
  15. const errStatus = error.response.status || -100
  16. if (autoErrorRes&&error.message) {
  17. MessageBox.alert('网络请求异常,请联系管理员!', '请求异常:' + errStatus, { confirmButtonText: '确定' })
  18. }
  19. return Promise.reject(error)
  20. })
  21. }
  22. /* 使用sessionStorage缓存的请求 */
  23. export const sessionRequest = (url, params = { }, config = { }, outTime = -1, autoErrorRes = true, autoErrorData = true, autoCancel = true) => {
  24. const itemKey = url + '#' + JSON.stringify(params) + JSON.stringify(config)
  25. let itemVal = sessionStorage.getItem(itemKey)
  26. const nowTime = new Date().getTime()
  27. if (itemVal) {
  28. itemVal = JSON.parse(itemVal)
  29. const overTime = nowTime - itemVal.lastTime
  30. if (outTime < 0 || overTime < outTime * 1000) {
  31. return Promise.resolve(itemVal.data)
  32. }
  33. }
  34. return request(url, params, config, autoErrorRes, autoErrorData, autoCancel).then(data => {
  35. sessionStorage.setItem(itemKey, JSON.stringify({
  36. 'lastTime': nowTime,
  37. 'data': data
  38. }))
  39. return data
  40. })
  41. }
  42. /* 使用localStorage缓存的请求 */
  43. export const localRequest = (url, params = { }, config = { }, outTime = 604800, autoErrorRes = true, autoErrorData = true, autoCancel = true) => {
  44. const itemKey = url + '#' + JSON.stringify(params) + JSON.stringify(config)
  45. let itemVal = localStorage.getItem(itemKey)
  46. const nowTime = new Date().getTime()
  47. if (itemVal) {
  48. itemVal = JSON.parse(itemVal)
  49. const overTime = nowTime - itemVal.lastTime
  50. if (outTime < 0 || overTime < outTime * 1000) {
  51. return Promise.resolve(itemVal.data)
  52. }
  53. }
  54. return request(url, params, config, autoErrorRes, autoErrorData, autoCancel).then(data => {
  55. localStorage.setItem(itemKey, JSON.stringify({
  56. 'lastTime': nowTime,
  57. 'data': data
  58. }))
  59. return data
  60. })
  61. }
  1. 参考2

    import axios from ‘axios’
    import env from ‘./env’
    import store from ‘../store’
    import router from ‘../router’
    import { message } from ‘ant-design-vue’
    //项目不同环境的baseURL
    // axios.defaults.baseURL = env.baseURL

    // 设置默认超时时间10s
    // axios.defaults.timeout = 10000

    // 创建axios实例
    let instance = axios.create({
    baseURL: env.baseURL,
    timeout: 8000
    })

    /* 跳登录页面 */
    const toLogin = () => {
    router.replace(‘/login’)
    }

    /* 请求失败后的统一错误处理 */
    const errorHandle = (status, other) => {
    // 状态码判断
    switch (status) {

    1. case 401:
    2. store.commit('deleteAccount')
    3. toLogin()
    4. break;
    5. case 404:
    6. message.error('请求的资源不存在')
    7. break;
    8. case 500:
    9. console.log(other)
    10. message.error('服务器错误')
    11. break;
    12. default:
    13. console.log(other)
    14. message.error(other.msg)
    15. break;

    }
    }

    // 请求拦截器
    instance.interceptors.request.use(config => {
    let authToken = localStorage.getItem(‘Authorization’)
    if(authToken){

    1. config.headers.Authorization = `jwt ${ authToken}`

    }
    return config
    }, error => {
    return Promise.reject(error)
    })

    // 响应拦截器
    instance.interceptors.response.use(
    // 2xx返回(测试202)
    response => {

    1. // console.log(response)
    2. let res = response.data
    3. if(response.status >= 200 && response.status < 300) {
    4. if(res.code === 'OK'){
    5. return Promise.resolve(res.data)
    6. } else {
    7. message.error(res.msg)
    8. return Promise.reject()
    9. }
    10. } else {
    11. return Promise.reject(res)
    12. }

    },

    // 2xx以外返回
    error => {

    1. // console.dir(error)
    2. const { response } = error
    3. if(response) {
    4. // 请求已发出,但是不在2xx范围内
    5. errorHandle(response.status, response.data)
    6. return Promise.reject(response)
    7. } else {
    8. //处理断网情况
    9. message.error('网络错误')
    10. return Promise.reject(error)
    11. }

    }
    )

    export default instance

发表评论

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

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

相关阅读

    相关 vue-封装axios请求

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

    相关 封装 axios 取消重复请求

    编者按:本文作者舒丽琦,奇舞团前端开发工程师 在我们web开发过程中,很多地方需要我们取消重复的请求。但是哪种场合需要我们取消呢?我们如何取消呢?带着这些问题我们阅读本文。