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

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

如何在Vue項目中使用axios請求

瀏覽:5日期:2022-09-30 08:00:43

在實際的項目中,和后臺的數(shù)據(jù)交互是少不了的,我通常使用的是 axios 庫,所以以下示例也是以 axios 為基礎來進行封裝的。

1、安裝

首先是 npm 安裝 axios 很簡單:npm install axios

2、沒有封裝存在的問題

如果在沒有封裝接口的項目中,在文件中隨處可以看到如下的接口調(diào)用方法:

this.$axios.post('/user/add', { params: {name: this.name,age: this.age }}).then(res => { console.log(res)}).then(err => { console.log(res)})

這樣寫不是不可以,但是存在一些缺陷,接口請求的 url 散布在各個文件中,如果需要在接口調(diào)用成功或失敗時做一些處理,就需要更改每個文件。所以把這些接口請求統(tǒng)一集中起來,如果有調(diào)整,直接在集中文件中找到修改就好了,而不用再去查每個文件。

3、創(chuàng)建文件

首先在項目的 src 目錄中,新建文件夾及文件目錄結(jié)構(gòu)如下:

├── src 源碼目錄

│ ├── apis 接口文件目錄

│ │ ├── login.api.js 登錄模塊的接口 api

│ │ └── user.api.js 用戶模塊的接口 api

│ ├── services 請求相關(guān)文件目錄

│ │ ├── address.js 請求地址配置文件

│ │ └── request.js axios封裝,請求攔截、響應碼處理等操作

api接口文件模塊的劃分,大可以根據(jù)自己的實際項目,按業(yè)務功能或業(yè)務邏輯或其他形式劃分。

4、請求地址配置

一般我們的項目環(huán)境都會有多個,少的也會有開發(fā)環(huán)境和生產(chǎn)環(huán)境。正常情況下,在開發(fā)環(huán)境下和生產(chǎn)模式下有著不同的 baseURL,所以,我們需要根據(jù)不同的環(huán)境切換不同的 baseURL。

address.js 文件:

// 根據(jù) process.env.NODE_ENV 切換不同的 baseURLconst isPro = process.env.NODE_ENV === ’production’​module.exports = { // ’apis’:vue.config.js中proxy設置的代理 baseURL: isPro ? ’http://192.168.100.120/ceds’ : ’/apis’}5、axios 配置,設置請求頭及響應碼處理

大體思路是通過封裝一個request類,其中包含了get、post等請求方法,這些請求方法又都會去調(diào)用 request 方法,該方法通過傳入的不同參數(shù)調(diào)用原始的 axios 請求,然后返回一個 Promise。

request.js 文件:

import axios from ’axios’import Qs from ’qs’import Vue from ’vue’import { getToken } from ’@Utils/session.utils’ // 存儲獲取token文件import address from ’./address’ // 請求地址​class Request { constructor () {// 創(chuàng)建axios實例this._axios = axios.create({ baseURL: address.baseURL, timeout: 1000 * 5, // 請求超時時間 headers: {}})// 請求攔截this._axios.interceptors.request.use( config => {const requestHeader = { ’X-Requested-With’: ’XMLHttpRequest’, ’Content-Type’: ’application/json; charset=UTF-8’, ’Access-Control-Allow-Origin’: ’*’, token: getToken() // 請求頭統(tǒng)一添加token}config.headers = Object.assign(config.headers, requestHeader)return config }, error => {Promise.reject(error) }) } // 根據(jù)請求方式,判斷參數(shù)是放在query中還是body中。 // 最直觀的區(qū)別,比如GET請求把參數(shù)包含在url中,而POST則通過request body把參數(shù)放置在body體中,所以在提交時的參數(shù)形式是有區(qū)別的 // 以下列了四種我一般常用請求方式的參數(shù)形式,大家可以自行調(diào)整 /** * 發(fā)送get請求 * @param {String} url地址 * @param {Object} query 查詢參數(shù) * @return json數(shù)據(jù) */ get (url, query = {}) {return this._request(’get’)(url, { ...query}) } /** * 發(fā)送post請求 * @param {String} url地址 * @param {Object} body 查詢參數(shù) * @return json數(shù)據(jù) */ post(url, body = {}, headers) {let data;if(this.isFormData(body)) { data = body} else if(Array.isArray(body)) { data = body} else { data = { ...body }}return this._request(’post’)(url, headers)(url, data); } put (url, body = {}) {return this._request(’put’)(url, { ...body}); } delete(url, body = {}) {return this._request(’delete’)(url, { ...body}); }​ isFormData = v => {return Object.prototype.toString.call(v) === ’[object FormData]’ }​​ /** * 設置請求頭 * @param {Object} header 請求頭 */ setHeaders (header) {Object.keys(header).forEach(key => { this._axios.defaults.headers[key] = header[key]}) }​ // 處理請求頭 headers handleHeaders () {const headers = {}headers[’XMIME-TYPE’] = ’3’Headers[’Content-Type’] = ’application/json; charset=UTF-8’return headers }​ /** * 發(fā)送請求 * @param {String} method 請求方法類型 * @param headers * @returns {function(*=, *=):Promise<unknown>} * @private */ _request (method, headers) {this.setHeaders(this.handleHeaders()) // 設置統(tǒng)一的請求頭if (headers) { this.setHeaders(headers) // 自定義請求頭} return (url, data, timeout) => { const config = {url,method,timeout: timeout || this._axios.defaults.timeout } // 構(gòu)造請求 config​ // 判斷請求類型 get post const paramType = [’get’, ’delete’].indexOf(method) !== -1 ? ’params’ : ’data’ config[paramType] = data //參數(shù)序列化 config.paramsSerializer = params => {return Qs.stringify(params, { arrayFormat: ’repeat’ }); } return new Promise((resolve, reject) => {// 發(fā)送真正的請求,驗證權(quán)限,檢查404等statusthis._axios .request(config) .then(response => {if (this.handleSuccessStatus(response.data.code, response.data)) { if (response.headers[’content-type’] !== ’text/plain; charset=urf-8’) { resolve( // 對響應結(jié)果二次包裝 Object.assign( { success: Number(response.data.code) === 200, data: response.data.data, msg: response.data.msg},  response.data )) // 處理返回結(jié)果 } else {resolve(response.data) }} }, response => {// 處理錯誤碼 if(response.response) { const statusCode = response.response.status this.handleErrorStatus(statusCode)} else { Vue.prototype.$message.error(response.message)}reject(response) }) .catch(err => {reject(err) })}) }} }​ // 請求成功,返回錯誤碼 // 具體狀態(tài)碼跟后臺開發(fā)人員統(tǒng)一,然后根據(jù)狀態(tài)碼進行相應提示 // 下面是我在項目中的操作,大家可自行調(diào)整擴展 handleSuccessStatus (code, data) {let result = ’’let flag = falseswitch (code) { case ’20007’:result = ’未查找到二次認證密碼!’flag = truebreak case ’20008’:result = ’您的二次認證密碼還未修改,請先修改!’flag = truebreak case ’20009’:result = ’您還未開啟二次認證,請聯(lián)系管理員!’flag = truebreak case ’90001’:result = ’請輸入二次認證密碼!’flag = truebreak case ’90002’:result = ’無操作權(quán)限!’flag = truebreak default:break}​// 進行通知// $message方法是我按需引入的element-ui中的提示組件,你可以替換成自己的提示組件if (result) { Vue.prototype.$message.error(result)}return flag } // 根據(jù)錯誤碼獲取錯誤提示 handleErrorStatus (statusCode) {let errorMsg = ’’if (statusCode === 500) { errorMsg = ’數(shù)據(jù)請求失敗,請聯(lián)系管理員!’} else if (statusCode === 404) { errorMsg = ’請求地址錯誤!’} else if (statusCode === 402) { errorMsg = ’當前您沒有權(quán)限操作該數(shù)據(jù)!’} else { errorMsg = ’請求出錯!’}// 進行通知Vue.prototype.$message.error(errorMsg) }}​export default new Request() 6、使用

我們在接口管理文件中,通過調(diào)用上面封裝的 request 類,傳入對應的參數(shù)即可。

user.api.js 文件:

import http from ’../services/request’​/** * @description 獲取用戶列表 * @param {*} params 請求接口的參數(shù) */// 此處定義的reqUserList方法會調(diào)用我們封裝的request中的get方法,get方法的第一個參數(shù)是請求地址,第二參數(shù)是query參數(shù)export const reqUserList = params => http.get(’/user/list’, params) 

在調(diào)用的 .vue 文件中,引入該方法并傳入?yún)?shù)即可

import { reqUserList } from ’@Apis/user.api’ // 導入api​export default { name: ’UserList’, ... ... created() { }, methods: {async getUsers() { // 調(diào)用api接口,并傳入?yún)?shù) const res = await reqUserList({page: 1,size: 10 }) console.log(res) // 獲取的響應結(jié)果} }}

如此,就完成了對接口的封裝及基本使用。

PS:以上這些文件名、文件夾名、方法名、路徑等都是我自己取得,你可以按照自己的代碼風格習慣進行調(diào)整。

以上就是如何在Vue項目中使用axios請求的詳細內(nèi)容,更多關(guān)于Vue項目中使用axios的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: IOS
相關(guān)文章:
主站蜘蛛池模板: 焊锡丝|焊锡条|无铅锡条|无铅锡丝|无铅焊锡线|低温锡膏-深圳市川崎锡业科技有限公司 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 耐高温电缆厂家-远洋高温电缆 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 菏泽知彼网络科技有限公司 | 印刷人才网 印刷、包装、造纸,中国80%的印刷企业人才招聘选印刷人才网! | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 收录网| 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 中矗模型-深圳中矗模型设计有限公司 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 苏州西朗门业-欧盟CE|莱茵UL双认证的快速卷帘门品牌厂家 | 博客-悦享汽车品质生活| 桂林腻子粉_内墙外墙抗裂砂浆腻子粉推荐广西鑫达涂料厂家供应 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 污泥烘干机-低温干化机-工业污泥烘干设备厂家-焦作市真节能环保设备科技有限公司 | 中式装修设计_室内中式装修_【云臻轩】中式设计机构 | 高低温试验房-深圳高低温湿热箱-小型高低温冲击试验箱-爱佩试验设备 | 陕西自考报名_陕西自学考试网| 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 湖南长沙商标注册专利申请,长沙公司注册代理记账首选美创! | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 抓斗式清污机|螺杆式|卷扬式启闭机|底轴驱动钢坝|污水处理闸门-方源水利机械 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 全温度恒温培养摇床-大容量-立式-远红外二氧化碳培养箱|南荣百科 | 威廉希尔WilliamHill·足球(中国)体育官方网站 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 | 耐压仪-高压耐压仪|徐吉电气| 自动化展_机器人展_机床展_工业互联网展_广东佛山工博会 | 一点车讯-汽车网站,每天一点最新车讯!| 劳动法网-专业的劳动法和劳动争议仲裁服务网|