电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

vue中封裝axios并實(shí)現(xiàn)api接口的統(tǒng)一管理

瀏覽:29日期:2022-10-15 15:06:48

在vue項(xiàng)目中,我們通常都是使用axios與后臺(tái)進(jìn)行數(shù)據(jù)交互,axios有很多好用的特性,這里不多做介紹,相關(guān)細(xì)節(jié)可以查閱axios中文網(wǎng)。在對(duì)axios進(jìn)行封裝之前,我們要使用vue腳手架工具創(chuàng)建一個(gè)vue項(xiàng)目(這里我用的是cli4)。

安裝

cnpm install axios --save-dev; // 安裝axioscnpm install qs --save-dev; // 安裝qs模塊,用來(lái)序列化post類型的數(shù)據(jù),否則后端無(wú)法接收到數(shù)據(jù)模塊引入

在src目錄下創(chuàng)建一個(gè)service目錄,用于存放接口封裝的相關(guān)文件。然后在service目錄中創(chuàng)建service.js,用于axios、qs模塊的引入,并在此文件中對(duì)axios進(jìn)行封裝。代碼如下(接口域名只有一個(gè)的情況):

import axios from ’axios’ //引入axiosimport qs from ’qs’ //引入qs,用來(lái)序列化post類型的數(shù)據(jù),否則后端無(wú)法接收到數(shù)據(jù)// 設(shè)置post請(qǐng)求頭axios.defaults.headers.post[’Content-Type’] = ’application/x-www-form-urlencoded;charset=UTF-8’;axios.defaults.withCredentials = false;//在跨域請(qǐng)求時(shí),不會(huì)攜帶用戶憑證;返回的 response 里也會(huì)忽略 cookie//創(chuàng)建axios實(shí)例,請(qǐng)求超時(shí)時(shí)間為300秒const instance = axios.create({ timeout: 300000,});//請(qǐng)求和響應(yīng)攔截可以根據(jù)實(shí)際項(xiàng)目需求進(jìn)行編寫// 請(qǐng)求發(fā)起前攔截instance.interceptors.request.use((config) => {//這里可以對(duì)接口請(qǐng)求頭進(jìn)行操作 如:config.headers[’X-Token’] = token console.log('請(qǐng)求攔截',config); return config;}, (error) => { // Do something with request error return Promise.reject(error)})// 響應(yīng)攔截(請(qǐng)求返回后攔截)instance.interceptors.response.use(response => { console.log('響應(yīng)攔截',response); return response;}, error => { console.log(’catch’, error) return Promise.reject(error)})//按照請(qǐng)求類型對(duì)axios進(jìn)行封裝const api={ get(url,data){return instance.get(url,{params:data}) }, post(url,data){return instance.post(url,qs.stringify(data)) }, }export {api}

上述代碼是接口域名只有一個(gè)的情況(多數(shù)情況),當(dāng)接口域名有多個(gè)的時(shí)候(少數(shù)情況),我們需要對(duì)之前的封裝進(jìn)行改造,代碼如下:

import axios from ’axios’ //引入axiosimport qs from ’qs’ //引入qs,用來(lái)序列化post類型的數(shù)據(jù),否則后端無(wú)法接收到數(shù)據(jù)// 設(shè)置post請(qǐng)求頭axios.defaults.headers.post[’Content-Type’] = ’application/x-www-form-urlencoded;charset=UTF-8’;axios.defaults.withCredentials = false;//在跨域請(qǐng)求時(shí),不會(huì)攜帶用戶憑證;返回的 response 里也會(huì)忽略 cookie//創(chuàng)建axios實(shí)例,請(qǐng)求超時(shí)時(shí)間為300秒,因?yàn)轫?xiàng)目中有多個(gè)域名,所以對(duì)應(yīng)的也要?jiǎng)?chuàng)建多個(gè)axios實(shí)例const instanceA = axios.create({ timeout: 300000,});const instanceB = axios.create({ timeout: 300000,});//如果項(xiàng)目為單一域名,這里可以不用進(jìn)行配置,當(dāng)項(xiàng)目接口有多個(gè)域名時(shí),要對(duì)axios實(shí)例基礎(chǔ)路徑進(jìn)行配置,否則在項(xiàng)目生產(chǎn)環(huán)境中無(wú)法進(jìn)行區(qū)別調(diào)用if (process.env.NODE_ENV == ’production’) { instanceA.defaults.baseURL = ’https://www.production_a.com’; instanceB.defaults.baseURL = ’https://www.production_b.com’;}//請(qǐng)求和響應(yīng)攔截可以根據(jù)實(shí)際項(xiàng)目需求進(jìn)行編寫// 請(qǐng)求發(fā)起前攔截instanceA.interceptors.request.use((config) => {//這里可以對(duì)接口請(qǐng)求頭進(jìn)行操作 如:config.headers[’X-Token’] = token console.log('請(qǐng)求攔截',config); return config;}, (error) => { // Do something with request error return Promise.reject(error)})instanceB.interceptors.request.use((config) => { console.log('請(qǐng)求攔截',config); return config;}, (error) => { // Do something with request error return Promise.reject(error)})// 響應(yīng)攔截(請(qǐng)求返回后攔截)instanceA.interceptors.response.use(response => { console.log('響應(yīng)攔截',response); return response;}, error => { console.log(’catch’, error) return Promise.reject(error)})instanceB.interceptors.response.use(response => { console.log('響應(yīng)攔截',response); return response;}, error => { console.log(’catch’, error) return Promise.reject(error)})//按照請(qǐng)求類型對(duì)axios進(jìn)行封裝const api={ get(url,data){return instanceA.get(url,{params:data}) }, post(url,data){return instanceA.post(url,qs.stringify(data)) }, doGet(url,data){return instanceB.get(url,{params:data}) }, doPost(url,data){return instanceB.post(url,qs.stringify(data)) } }export {api}

上述代碼中有根據(jù)生產(chǎn)環(huán)境對(duì)axios實(shí)例的基礎(chǔ)路徑進(jìn)行配置,如果項(xiàng)目中有多個(gè)環(huán)境(如:測(cè)試環(huán)境等),則需要對(duì)CLI4腳手架環(huán)境變量進(jìn)行配置

api接口統(tǒng)一管理

將api接口按照功能模塊進(jìn)行拆分,把同一模塊下的接口寫在同一個(gè)文件中進(jìn)行統(tǒng)一管理,這樣代碼會(huì)更容易維護(hù)。比如我們的項(xiàng)目中有新聞模塊,音樂模塊等。我們就在serviec目錄中創(chuàng)建news.js、music.js文件,用于管理各自模塊的所有api接口,這里我只拿news.js文件為例,代碼如下:

import {api} from './service.js';const news={getNewsList(){//獲取新聞列表return api.get('api/news/getNewsList')},editNewsDetail(data){//修改新聞詳情return api.post('api/news/editNewsDetail',data);}}export default news;

為了更方便在項(xiàng)目中調(diào)用這些封裝好的接口,我們需要將這些接口掛載到vue的原型上,首先我們要在service目錄中創(chuàng)建api.js文件,將所有模塊的api管理文件引入進(jìn)來(lái),然后進(jìn)行統(tǒng)一導(dǎo)出,代碼如下:

//引入相關(guān)api管理模塊import news from './news.js';//進(jìn)行統(tǒng)一導(dǎo)出export default {news}

找到項(xiàng)目中的main.js文件,將接口掛載到vue的原型上,代碼如下:

import Vue from ’vue’import App from ’./App.vue’import router from ’./router’import store from ’./store’import axios from ’axios’Vue.prototype.axios=axiosVue.config.productionTip = falseimport api from './service/api.js';//將封裝的接口掛載到vue原型上Vue.prototype.$api = api;new Vue({ router, store, render: h => h(App)}).$mount(’#app’)

然后我們?cè)陧?xiàng)目創(chuàng)建完成時(shí)自動(dòng)生成的模板文件App.vue調(diào)用封裝好的接口,代碼如下:

<template> <div id='app'> <div id='nav'><router-link to='/'>Home</router-link> |<router-link to='/about'>About</router-link><button @click='getN'>接口封裝getN</button><button @click='postN'>接口封裝postN</button> </div> <router-view/> </div></template><script>export default {methods:{getN(){this.$api.news.getNewsList().then((res)=>{console.log(res);})},postN(){let openid='oO5tQ5VMPpuzLqwfXhpmwjqwSANM';let productCodes='pro-1337270496655446016';this.$api.news.editNewsDetail({openid,productCodes}).then((res)=>{alert(res.data.msg);})}}}</script><style lang='scss'>#app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50;}#nav { padding: 30px; a { font-weight: bold; color: #2c3e50; &.router-link-exact-active { color: #42b983; } }}</style>配置代理

因?yàn)槲覀円诒镜丨h(huán)境進(jìn)行測(cè)試,這就涉及到了跨域問題,為了解決跨域問題,我們可以進(jìn)行代理的配置,在項(xiàng)目根目錄中創(chuàng)建vue.config.js文件,然后可以對(duì)項(xiàng)目進(jìn)行各種配置,代理的配置方法如下:

// vue.config.jsmodule.exports = { // 輸出文件目錄 outputDir: 'dist', // eslint-loader 是否在保存的時(shí)候檢查 lintOnSave: false, // 基本路徑 publicPath: process.env.NODE_ENV === 'production' ? './' : '/', devServer: { host: 'localhost', port: 8080, open: true, hotOnly: true, // 熱更新 // 設(shè)置代理 proxy: { '/api': { // 本地mock服務(wù)器 target: 'https://www.xxxx.com/xxx/', changeOrigin: true, ws: false, }, //如果項(xiàng)目中存在多個(gè)域名接口,可依次進(jìn)行配置'/apib':{target: 'https://www.xxxx.com/xxx/',changeOrigin: true,ws: false,}, }, },};

代理配置好了之后,就可以運(yùn)行項(xiàng)目了,命令行中輸入npm run serve,項(xiàng)目啟動(dòng)好了之后,就可以進(jìn)入頁(yè)面點(diǎn)擊按鈕,測(cè)試之前做的封裝是否好用。

結(jié)語(yǔ)

以上就是本人對(duì)vue中封裝axios的一點(diǎn)心得,文章有錯(cuò)誤或需要改進(jìn)的地方還請(qǐng)與我聯(lián)系,我將及時(shí)進(jìn)行更正,感謝閱讀。

以上就是vue中封裝axios并實(shí)現(xiàn)api接口的統(tǒng)一管理的詳細(xì)內(nèi)容,更多關(guān)于vue 封裝axios的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: IOS
相關(guān)文章:
主站蜘蛛池模板: 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂] | 广州/东莞小字符喷码机-热转印打码机-喷码机厂家-广州瑞润科技 | 浙江浩盛阀门有限公司| 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 牛奶检测仪-乳成分分析仪-北京海谊 | 石牌坊价格石牌坊雕刻制作_石雕牌坊牌楼石栏杆厂家_山东嘉祥石雕有限公司 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 骨龄仪_骨龄检测仪_儿童骨龄测试仪_品牌生产厂家【品源医疗】 | 迪威娱乐|迪威娱乐客服|18183620002 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 电池高低温试验箱-气态冲击箱-双层电池防爆箱|简户百科 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 健身器材-健身器材厂家专卖-上海七诚健身器材有限公司 | 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 | 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 电主轴,车床电磨头,变频制动电机-博山鸿达特种电机 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | 氮化镓芯片-碳化硅二极管 - 华燊泰半导体 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | MES系统工业智能终端_生产管理看板/安灯/ESOP/静电监控_讯鹏科技 |