工程实践中,axios请求api应该如何较好的封装

在工程实践中,我看到很多的axios封装都是挂载在vue的原型链上的,这样的好处就是可以用vue实例去调用,但是这样是会影响效率的。而我们项目中,或者很多大厂的封装是深度解耦的且易于维护的。我平时是这样封装的,先看目录结构。

requset

     -----apiUrl.js (存放所有的api路径映射,这里可以分模块,我们已一个最简单的实践)

     -----conmon.js (公用的请求,比如post,get,delete,put等)

    ------service.js (创建axois实例,做请求和响应拦截)

api

     ------api.js (细分解耦,高度封装,统一的管理)

use.vue (演示文件)

#requset->apiUrl.js  (......代表省略)

const url = {
    login:'/login',
    ......
    ......
}
export default url

#requset->-service.js

import axios from 'axios'

//获取token
function getToken(){
    let token = sessionStorage.getItem('token') || ''; // 具体看存在哪
    return token;
}
// 创建实例
const service = axios.create({
    baseURL:'/api',
    timeout:5000 // 其他配置参照官网
});

//http request请求拦截
service.interceptors.request.use(
    config =>{
        // 具体看项目的实际情况
        if(getToken()){
            config.headers['token'] = getToken();
            config.headers['Content-Type']="application/json;charset=utf-8"
        }
        return config;
    },
    error =>{
        Promise.reject(error)
    }
) 

// http response拦截器
service.interceptors.response.use(
    response => {
        if (response.status && response.status === 200) {
            return response.data
        }
    },
    error => {
        // 注意 有些项目是统一返回200,然后自己封装了一个状态码,底下的应该放到上面做处理
        if (error.response) {
            switch (error.response.status) {
            case 401:
                // dosomething
                break
            case 404:
                 // dosomething
                break
            case 500:
                // dosomething
                break
            default:
                 // dosomething
                break
            }
        } else {
            // dosomething
        }
        return Promise.reject(error)
    }
)

export default service

#requset->-common.js

import service from './service'
export function requestPost(url,data){
    return service.post(url,data)
}

 

#api->-api.js

// (是不是觉得多此一举?),为什么在需要封装一层promise呢,因为axios放弃了finally的使用,这样封装之后就可以使用这个方法了。
import requestPost from '../request/common.js'
export function postRequest(url,data){
    return new Promise((resolve,reject)=>{
        requestPost(url,data).then(res=>resolve(res))
        .catch(error=>reject(error))
    })
}

#use.vue

import url from './request/aptUrl'
import {postRequest} from './api/api'

methods:{
    async login(){
        let parames = {
            userName:'admin',
            password:'123456'
        }
        let loginData = await postRequest(url.loginUrl,parames);// await 和 async 配套使用,推荐这样使用

        //或者使用then方式,但是也很容易陷入地狱回调 postRequest(url.loginUrl,parames).then(res=>console.log(res))
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三木森森の

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值