vue中二次封装axios请求,支持url参数拼接、blob数据流和formdata上传等

本文介绍了如何在Vue项目中针对axios进行二次封装,以适应各种复杂的请求场景,包括url参数拼接、blob数据流处理和formData上传。详细列举并封装了get和post请求的各种可能组合,确保能够处理不规范的接口需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在vue项目基本上都是使用axios进行请求操作,但是axios有时候并不能完全满足业务的需求,因为官方axios只支持一些比较规则的请求参数和方式,比如body类型的post,params类型的get。

而实际业务中后台给的接口可不会那么如你所愿的规范,当后台同事肆意挥洒,尽情装逼,完全是即兴发挥,不考虑前端感受的时候,往往给出来的api接口是很变态的:

get方法的url后面拼接参数?

没办法,谁让前端是万能的呢,只能将就一下后台同事了。

实际项目中用到的最多的方式就是get和post,所以这里主要以封装get和post为例,patch、delete等方法封装与此类似。

分析:

get请求可以有的组合方式:

1、没有参数

2、有参数,参数以query的形式拼接在url上:api/customer?a=xxx&b=yyy

3、有参数,参数以path的形式拼接到url上:api/customer/xxx/yyy

4、有参数,参数以path的形式替换指定字段拼接到url上:api/customer/xxx/yyy

5、无参数,请求返回的数据为blob数据流形式

6、有参数,请求返回的数据为blob数据流形式,参数以path的形式拼接到url上,api/customer/xxx/yyy

7、有参数,请求返回的数据为blob数据流形式,参数以query的形式拼接到url上,api/customer?a=xxx&b=yyy

post请求可以有的组合方式:

1、没有参数

2、有参数,参数以json格式放在body里

3、有参数,参数以path的形式拼接到url上:api/customer/xxx/yyy

4、有参数,参数以query的形式拼接到url上:api/customer?a=xxx&b=yyy

5、无参数,上传formdata数据,部分参数以以json格式放在body里(选传)

6、有参数,上传formdata数据,部分参数以以json格式放在body里(选传),部分参数以path的形式拼接到url上,api/customer/xxx/yyy

7、有参数,上传formdata数据,部分参数以以json格式放在body里(选传),部分参数以query的形式拼接到url上,api/customer?a=xxx&b=yyy

8、无参数,接收blob数据流,部分参数以以json格式放在body里(选传)

9、无参数,接收blob数据流,部分参数以以json格式放在body里(选传),部分参数以path的形式拼接到url上,api/customer/xxx/yyy

10、无参数,接收blob数据流,部分参数以以json格式放在body里(选传),部分参数以query的形式拼接到url上,api/customer?a=xxx&b=yyy

大致就罗列了这么些可能的组合,太多了!

封装请求:

在文件目录下新建service>reset-api.js和service>api-urls.js

api-urls.js 存放所有api接口

const apis = {
    // get
    get: '/api/shop/customer/get', // get
    getNormal: '/api/shop/customer/query', // query
    getOrderPath: '/api/shop/customer/getOrderPath', // getOrderPath
    getLocationPath: '/api/shop/customer/fileCode/page', // 指定字段替换
    getBlob: '/api/shop/customer/getBlob', // getBlob
    getPathBlob: '/api/shop/customer/getPathBlob', // getPathBlob
    getQueryBlob: '/api/shop/customer/getQueryBlob', // getQueryBlob
    // post
    postBody: '/api/shop/customer/body', // body
    postPath: '/api/shop/customer/body', // bodyPath
    postQuery: '/api/shop/customer/body', // bodyQuery
    postFormData: '/api/shop/customer/formData', // formData
    postFormDataPath: '/api/shop/customer/formDataPath', // formDataAndPath
    postFormDataQuery: '/api/shop/customer/formdataQuery', // formdataAndQuery
    postBlob: '/api/shop/customer/postBlob', // postBlob
    postBlobPath: '/api/shop/customer/postBlobPath', // postBlob
    postBlobQuery: '/api/shop/customer/postBlobQuery', // postBlobQuery
};

export default apis

get封装

为防止ie下get方法读取缓存,在url后默认添加时间戳_t字段

1、没有参数的时候,可直接使用别名方法:

                return axios.get(url, {
                    headers: {
                        token: token,
                    },
                });

 

2、query形式参数,可使用params字段

                return axios.get(url, {
                    params: data,
                    headers: {
                        token: token,
                    },
                });

3、参数按path拼接到url上

                if (Object.keys(data).length) {
                    for (let key in data) {
                        url += `/${data[key]}`;
                    }
                }
                url += `?_t=${Date.now()}`; // 加时间戳,防止ie取缓存
                return axios.get(url, {
                    headers: {
                        token: token,
                    },
                });

4、指定位置替换,path形式拼接到url上

url上必须包含需被替换的字段:api/customer/name/age

传参数时字段必须和要替换的一一对应:{name: 'abc',age:12}

被替换后:api/customer/abc/12

                if (Object.keys(data).le
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值