Vue使用axios
前言
当然,ajax也可以用于实现数据请求,但是ajax通常适合MVC模型。同时ajax被封装与JQuery,我们总不能为例单次使用ajax而引用整个JQuery.
优点
- 使用简单,体积小
- 支持promise
- 能拦截请求和响应并处理(可用于处理token)
- 可防止CSRF(跨站请求伪造)攻击 -(在请求中附带cookie, 根据浏览器同源策略, 其它网站拿不到cookie,从而避免攻击)
安装与引用
- CDN引入
<script src="https://cdn.staticfile.org/axios/0.19.0/axios.min.js"></script>
- npm安装与引入
$ npm install axios
import axios from 'axios'
创建axios对象(vue为例)
import axios from 'axios'
import { getToken, setToken } from '../utils/token'
import router from '../router/index'
const service = axios.create({
// 设置超时时间 ms
timeout: 60000,
// 可设置根路径 带不带斜杠都行
baseURL: '/api'
})
// 请求拦截器
service.interceptors.request.use(config => {
const token = getToken()
if (token) {
// 为请求头添加token
config.headers.token = token
}
return config
}, (error) => {
return Promise.reject(error)
})
// 响应拦截器
service.interceptors.response.use(
response => {
// 如果返回未登录错误 返回登录页面
if (response.data.LoginErr) {
setToken('')
router.replace({
name: 'login'
})
return
}
return response
},
error => {
if (error && error.response) {
switch (error.response.status) {
case 400:
error.message = '请求错误'
break
case 401:
error.message = '未授权,请登录'
break
case 403:
error.message = '拒绝访问'
break
case 404:
error.message = `请求地址出错: ${error.response.config.url}`
break
case 408:
error.message = '请求超时'
break
case 500:
error.message = '服务器内部错误'
break
case 501:
error.message = '服务未实现'
break
case 502:
error.message = '网关错误'
break
case 503:
error.message = '服务不可用'
break
case 504:
error.message = '网关超时'
break
case 505:
error.message = 'HTTP版本不受支持'
break
default:
break
}
}
return Promise.reject(error)
}
)
export default service
调用
// 引用上面创建的axiox对象
import axios from './index'
// 也可以不创建直接使用
// import axios from 'axios'
const http = {
request: function (url, data) {
return new Promise((resolve, reject) => {
axios({
url: url,
method: 'post',
data: data
})
.then((res) => {
resolve(res.data)
})
.catch(function (error) {
reject(error)
})
})
},
get: function (url) {
return new Promise((resolve, reject) => {
axios.get(url)
.then((response) => {
resolve(response.data)
})
.catch((error) => {
reject(error)
})
})
},
post: function (url, data) {
return new Promise((resolve, reject) => {
axios.post(url, data)
.then((response) => {
resolve(response.data)
})
.catch((error) => {
reject(error)
})
})
}
}
export default http
原博客链接:https://www.cnblogs.com/xpengp/