持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情juejin.cn/post/714765…
今天学习了在Vue中如何进行前后台数据交互?
以前学过的ajax和fetch都可以在vue里使用,但是现在vue推荐使用axios。
Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。
使用方法:
在入口文件main.js里:
- 1、先
import Axios from "axios" - 2、把Axios添加到Vue的实例上,这样的话就各个组件通过
this.$axios直接使用了,所以在入口文件里写Vue.prototype.$axios=Axios。 - 也可以单个组件单个引入。
- 像上面这样,如果把Axios放在vue的实例上,就不需要挨个引入了。
axios配置:
- url:请求接口
- method:请求方法,不写的话默认给get请求
- transformRequest可以在发送请求之前修改data,return出去的data就是要发给服务器的。该属性值可以是个函数,那么进行拦截的时候只执行这一个函数;值也可以是一个数组,进行拦截的时候,挨个执行函数。函数都接收data和headers两个参数。
- transformResponse该函数会把请求回来的数据进行拦截,对数据修改之后进行return,这样axios的promise接收到的就是修改之后的数据
- Header:设置请求头
- params:
params是与请求一起发送的 URL 参数, 必须是一个简单对象或URLSearchParams对象 - timeout:
timeout指定请求超时的毫秒数。如果请求时间超过timeout的值,则请求会被中断。默认是'0',永不超时。 - withCredentials:跨域的时候是否发送凭证(即是否发送cookie),默认是false,不发送;改为true就是可以进行跨域
- baseURL:设置绝对的请求rel,发送请求时会把baseURL和url进行拼接。
- proxy:服务器代理
{
proxy: {
protocol: 'https',//协议
host: '127.0.0.1', //本机的ip地址
port: 9000,//端口号
auth: { username: 'mikeymike', password: 'rapunz3l' } //用户
},
}
axios的返回值是promise。服务器返回的数据在then方法的value的data里,也可以使用catch捕获错误
全局默认值
Axios.defaults.baseURL = 'https://api.example.com';//
Axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;//设置的cookie默认值
Axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
拦截器
- 拦截器可以放在单文件组件里,也可以放在main.js里,大多数放在入口文件进行拦截
- 大多数时候都是先进行一些判断,如果怎么样,我返回什么的数据,否则我就返回请求的原数据
请求拦截器:
请求拦截器的作用是在请求发送前进行一些操作,例如在每个请求体里加上token,每次请求携带token传给后端,统一做处理。
响应拦截器:
响应拦截器的作用是在接收到响应后进行一些操作,例如在服务器返回登录状态token失效,需要重新登录的时候,跳转到登录页,对不同状态码做不同处理。
import axios from 'axios'
//初始化axios
const Axios = axios.create({
baseURL: '请求地址',
withCredentials: true, //跨域请求时发送cookies
headers: {
'content-type': 'application/x-www-form-urlencoded'
},
})
//请求拦截器
Axios.interceptors.request.use(
config => {
// 判断是否存在token,把token添加到请求头中,每次请求携带token传给后端
if (store.getters.token) {
config.headers['token'] = getToken()
}
return config
},
error => {
//处理错误请求
return Promise.reject(error)
}
)
//响应拦截器
service.interceptors.response.use(
response=> {
const res = response.data
if (res.code !== 200) {
//请求失败(包括token失效,302,404...根据和后端约定好的状态码做出不同的处理)
return res
}else{
//请求成功
return res
}
}
return config
},
error => {
//处理错误响应
return Promise.reject(error)
}
)
取消请求:
- 要先创建AbortController对象,然后调用它的abort方法取消请求
- const controller = new AbortController();
- controller.abort()