vue 使用axios 數(shù)據(jù)請求第三方插件的使用教程詳解
axios
基于http客戶端的promise,面向瀏覽器和nodejs
特色
•瀏覽器端發(fā)起XMLHttpRequests請求
•node端發(fā)起http請求
•支持Promise API
•監(jiān)聽請求和返回
•轉(zhuǎn)化請求和返回
•取消請求
•自動轉(zhuǎn)化json數(shù)據(jù)
•客戶端支持抵御
安裝
使用npm:
$ npm i axiso
為了解決post默認使用的是x-www-from-urlencoded 去請求數(shù)據(jù),導(dǎo)致請求參數(shù)無法傳遞到后臺,所以還需要安裝一個插件QS
$ npm install qs
一個命令全部解決
$ npm install --save axios vue-axios qs
兩種方法在vue中使用 axios
方法-:修改原型鏈
首先在 main.js 中引入 axios
import Axiso from 'axiso'
這時候如果在其它的組件中,是無法使用 axios 命令的。但如果將 axios 改寫為 Vue 的原型屬性,就能解決這個問題
Vue.prototype.$axios= Axios
配置好了之后就可以全局使用了
示例:在main.js使用
Get請求:
//發(fā)起一個user請求,參數(shù)為給定的ID
$axios.get('/user?ID=1234')
.then(function(respone){
console.log(response);
})
.catch(function(error){
console.log(error);
});
Post請求
$axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
為了保證請求的數(shù)據(jù)正確,可以在main.js配置如下內(nèi)容:
Axios.defaults.baseURL = 'https://api.example.com';//配置你的接口請求地址 Axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;//配置token,看情況使用 Axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';//配置請求頭信息。
那么最基本的配置已經(jīng)完成了,但是還有一個問題,既然是前后端分離,那么肯定避免不了跨域請求數(shù)據(jù)的問題,接下來就是配置跨域了。
在config/index.js里面的dev里面配置如下代碼:
proxyTable: {
'/api': {
target: 'http://xxx.xxx.xxx.xxx:8081/',//設(shè)置你調(diào)用的接口域名和端口號 別忘了加http
changeOrigin: true,
pathRewrite: {
'^/api': '/'//這里理解成用‘/api'代替target里面的地址,后面組件中我們掉接口時直接用api代替 比如我要調(diào)用'http://xxx.xxx.xxx.xx:8081/user/add',直接寫‘/api/user/add'即可
}
}
完整代碼:
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/api': {
target: 'http://xxx.xxx.xxx.xxx:8081/',//設(shè)置你調(diào)用的接口域名和端口號 別忘了加http
changeOrigin: true,
pathRewrite: {
'^/api': '/'//這里理解成用‘/api'代替target里面的地址,后面組件中我們掉接口時直接用api代替 比如我 要調(diào)用'http://xxx.xxx.xxx.xxx:8081/user/add',直接寫‘/api/user/add'即可
}
}
},
但是注意了,這只是開發(fā)環(huán)境(dev)中解決了跨域問題,生產(chǎn)環(huán)境中真正部署到服務(wù)器上如果是非同源還是存在跨域問題.
axios攔截器的使用
當(dāng)我們訪問某個地址頁面時,有時會要求我們重新登錄后再訪問該頁面,也就是身份認證失效了,如token丟失了,或者是token依然存在本地,但是卻失效了,所以單單判斷本地有沒有token值不能解決問題。此時請求時服務(wù)器返回的是401錯誤,授權(quán)出錯,也就是沒有權(quán)利訪問該頁面。
我們可以在發(fā)送所有請求之前和操作服務(wù)器響應(yīng)數(shù)據(jù)之前對這種情況過濾。
// http request 請求攔截器,有token值則配置上token值
axios.interceptors.request.use(
config => {
if (token) { // 每次發(fā)送請求之前判斷是否存在token,如果存在,則統(tǒng)一在http請求的header都加上token,不用每次請求都手動添加了
config.headers.Authorization = token;
}
return config;
},
err => {
return Promise.reject(err);
});
// http response 服務(wù)器響應(yīng)攔截器,這里攔截401錯誤,并重新跳入登頁重新獲取token
axios.interceptors.response.use(
response => {
return response;
},
error => {
if (error.response) {
switch (error.response.status) {
case 401:
// 這里寫清除token的代碼
router.replace({
path: 'login',
query: {redirect: router.currentRoute.fullPath}//登錄成功后跳入瀏覽的當(dāng)前頁面
})
}
}
return Promise.reject(error.response.data)
});
安裝qs插件后的簡化操作
$ npm install qs import QS from 'qs'
//axios攔截器
// 超時時間
Axios.defaults.timeout = 5000;
// http請求攔截器 請求之前的一些操作
Axios.interceptors.request.use(config => {
if(config.method=='post'){
config.data=QS.stringify(config.data);//防止post請求參數(shù)無法傳到后臺
}
return config
}, error => {
Message.error({
message: '加載超時'
});
return Promise.reject(error)
});
// http響應(yīng)攔截器 請求之后的操作
Axios.interceptors.response.use(data => {
return data
}, error => {
Message.error({
message: '加載失敗'
});
return Promise.reject(error)
});
<span style="color: rgb(255, 0, 0);"> if(config.method=='post'){
config.data=QS.stringify(config.data);//防止post請求參數(shù)無法傳到后臺
}</span><br>這句可以直接代替
<span style="color: rgb(255, 0, 0);">Axios.defaults.baseURL = 'https://api.example.com';//配置你的接口請求地址 Axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;//配置token,看情況使用 Axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';//配置請求頭信息。</span>
<br><span style="font-size: 14pt;">vue 訪問本地json文件的數(shù)據(jù)測試配置方法<br>第一步,準(zhǔn)備json數(shù)據(jù)<br>json文件位置:src/data/data.json<br>第二步,配置webpack.dev.conf.js 文件<br>在webpack.dev.config.js 里面添加如下代碼:<br></span>
// webpack.dev.conf.js
// 通過express導(dǎo)入路由
const express = require('express')
const app = express()
var appData = require('../src/data/data.json')
// json賣家數(shù)據(jù)
var seller = appData.seller
// json商品數(shù)據(jù)
var goods = appData.goods
// json評論數(shù)據(jù)
var ratings = appData.ratings
// 編寫路由
var apiRoutes = express.Router()
// 所有通過接口相關(guān)的api都會通過api這個路由導(dǎo)向到具體的路由
app.use('/api', apiRoutes)
//devServer下寫入如下代碼:
before(app) {
app.get('/api/seller', (req, res) => {
res.json({
errno: 0,
data: seller
})//接口返回json數(shù)據(jù),上面配置的數(shù)據(jù)seller就賦值給data請求后調(diào)用
}),
app.get('/api/goods', (req, res) => {
res.json({
errno: 0,
data: goods
})
}),
app.get('/api/ratings', (req, res) => {
res.json({
errno: 0,
data: ratings
})
})
}
按照如上配置就大功告成了,webpack.dev.config.js 完整代碼如下:
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
// webpack.dev.conf.js
// 通過express導(dǎo)入路由
const express = require('express')
const app = express()
var appData = require('../src/data/data.json')
// json賣家數(shù)據(jù)
var seller = appData.seller
// json商品數(shù)據(jù)
var goods = appData.goods
// json評論數(shù)據(jù)
var ratings = appData.ratings
// 編寫路由
var apiRoutes = express.Router()
// 所有通過接口相關(guān)的api都會通過api這個路由導(dǎo)向到具體的路由
app.use('/api', apiRoutes)
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
},
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
},
before(app) {
app.get('/api/seller', (req, res) => {
res.json({
errno: 0,
data: seller
})//接口返回json數(shù)據(jù),上面配置的數(shù)據(jù)seller就賦值給data請求后調(diào)用
}),
app.get('/api/goods', (req, res) => {
res.json({
errno: 0,
data: goods
})
}),
app.get('/api/ratings', (req, res) => {
res.json({
errno: 0,
data: ratings
})
})
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.dev.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})
main.js完整代碼如下:
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import Axios from 'axios'
import QS from 'qs'
Vue.prototype.$axios=Axios //原型鏈配置
Vue.config.productionTip = false
//axios攔截器
// 超時時間
Axios.defaults.timeout = 5000;
// http請求攔截器
Axios.interceptors.request.use(config => {
if(config.method=='post'){
config.data=QS.stringify(config.data);//防止post請求參數(shù)無法傳到后臺
}
return config
}, error => {
Message.error({
message: '加載超時'
});
return Promise.reject(error)
});
// http響應(yīng)攔截器
Axios.interceptors.response.use(data => {
return data
}, error => {
Message.error({
message: '加載失敗'
});
return Promise.reject(error)
});
// 注冊一個全局自定義指令 `v-focus`
Vue.directive('focus', {
// 當(dāng)被綁定的元素插入到 DOM 中時……
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})
本地成功請求數(shù)據(jù)效果:

<span style="font-size: 14pt;"> </span>
總結(jié)
以上所述是小編給大家介紹的vue 使用axios 數(shù)據(jù)請求第三方插件的使用教程詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
- Vue二次封裝axios為插件使用詳解
- vue下axios攔截器token刷新機制的實例代碼
- Vue學(xué)習(xí)之a(chǎn)xios的使用方法實例分析
- vue 對axios get pust put delete封裝的實例代碼
- Vue axios 將傳遞的json數(shù)據(jù)轉(zhuǎn)為form data的例子
- Vue 設(shè)置axios請求格式為form-data的操作步驟
- 關(guān)于Vue中axios的封裝實例詳解
- vue中axios的二次封裝實例講解
- vue+axios實現(xiàn)post文件下載
- vue + axios get下載文件功能
- Vue CLI項目 axios模塊前后端交互的使用(類似ajax提交)
- vue簡單封裝axios插件和接口的統(tǒng)一管理操作示例
相關(guān)文章
Vue組合式API如何正確解構(gòu)props不會丟失響應(yīng)性
響應(yīng)式?API?賦予了組合式?API?一大坨可能性的同時,代碼精簡,雖然但是,我們應(yīng)該意識到響應(yīng)性的某些陷阱,比如丟失響應(yīng)性,在本文中,我們將學(xué)習(xí)如何正確解構(gòu)?Vue?組件的?props,使得?props?不會丟失響應(yīng)性2024-01-01
vue使用Office?Web實現(xiàn)線上文件預(yù)覽
這篇文章主要為大家介紹了vue使用微軟的開發(fā)接口Office?Web,實現(xiàn)線上文件預(yù)覽,預(yù)覽word,excel,pptx,pdf文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
element-ui中導(dǎo)航組件menu的一個屬性:default-active說明
這篇文章主要介紹了element-ui中導(dǎo)航組件menu的一個屬性:default-active說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
詳解Vue3?SFC?和?TSX?方式調(diào)用子組件中的函數(shù)
在使用?.vue?定義的組件中,setup?中提供了?defineExpose()?方法,該方法可以將組件內(nèi)部的方法暴露給父組件,這篇文章主要介紹了Vue3?SFC?和?TSX?方式調(diào)用子組件中的函數(shù),需要的朋友可以參考下2022-10-10

