一、axios请求方式
axios安装教程:
https://www.npmjs.com/package/vue-axios
第一种:params,不安全
//.then是响应成功的结果,.catch是请求失败的结果
login(){
//psot有参请求
this.axios.post('/api/cunluo/userinfo/unintercept/userinfoLogin',
{
params: {
uEmail: "test1",
uPassword: "123456"
}
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err)
})
}
第二种:
//url后“name=张三”
//推荐这种post请求发送参数
this.axios
.post("/api/cunluo/userinfo/unintercept/userinfoLogin",
"uEmail:test1&uPassword:123456"
)
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
第三种:data
this.axios
.post("/api/cunluo/userinfo/unintercept/userinfoLogin", {
data: {
sId: 108,
password: "123456",
},
})
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
第四种:url后面{ },需要后端配合
//后台服务器端给接收的参数加上@requestBody,然后在请求中更改
this.axios
.post("/api/cunluo/userinfo/unintercept/userinfoLogin", {
uEmail: "test1",
uPassword: "123456",
})
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
二、vue中axios解决跨域设置代理问题
1.在vue中config文件下的index.js文件中配置代理
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/api':{ //匹配所有以 'api'开头的请求路径
target:'http://111.231.227.66/', //代理目标的基础路径
changeOrigin:true, //支持跨域
secure:false,
pathRewrite:{ //重写路径:去掉路径中的开头的'/api'
'^/api':''
}
}
},
2.在axios请求路径中更改
login(){
this.axios.post('/api/cunluo/userinfo/unintercept/userinfoLogin',
{
params: {
uEmail: "test1",
uPassword: "123456"
}
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err)
})
}
三、axios并发请求
axios.spread实现并发,处理响应数据结果
this.axios
.all([
this.axios.post("/api/cunluo/userinfo/unintercept/userinfoLogin", {
uEmail: "test1",
uPassword: "123456",
}),
this.axios.post("/api/cunluo/userinfo/unintercept/userinfoLogin"),
this.axios.post("/api/cunluo/userinfo/unintercept/userinfoLogin")
])
.then(
//axios.spread几个参数就有几个返回请求值(处理响应数据结果)
this.axios.spread((one, two,three) => {
console.log(one), console.log(two),console.log(three);
})
)
.catch((err) => {
console.log(err);
});
四、axios全局配置属性
//api已经在配置代理那写了,所以post请求中可以不写/api
//和配置代理配合使用
this.axios.defaults.baseURL='/api';
this.axios.defaults.timeout=5000; //延迟多少毫秒没有反应就报错超时
this.axios.post('/cunluo/userinfo/unintercept/userinfoLogin').then(res=>{
console.log(res)
})
五、axios的实例
let newvar=this.axios.create({
baseURL:'/api',
timeout:5000
})
//实例中也可以添加method属性
let newvar2=this.axios.create({
baseURL:'/api/cunluo',
timeout:5000
})
//全局是全部axios都可以使用,实例是用这个实例时,才能用实例中的属性
newvar({
method:'post',
url:'/cunluo/userinfo/unintercept/userinfoLogin'
}).then(res=>{
console.log(res);
})
//这就是实例的封装
newvar2({
method:'post',
url:'/userinfo/unintercept/userinfoLogin'
}).then(res=>{
console.log(res);
})
六、axios拦截器
//axios给我们提供了两大类拦截器
// 一种是请求方向的拦截(成功请求,失败的) 另一种是响应方向的(成功的,失败的)
//拦截器的作用 用于我们在网络请求的时候在发送请求或者响应是对操作进行响应的处理
//具体用于 发送请求时可以添加网页加载的动画 强制登录
//响应的时候可以进行相应的数据处理
1.常规请求方式
this.axios
.post("/api/cunluo/userinfo/unintercept/userinfoLogin")
.then((res) => {
console.log(res);
console.log("post响应回来的数据");
});
请求方向的拦截(第一个是拦截,第二个是错误回调)
this.axios.interceptors.request.use(
(config) => {
console.log("进入请求拦截器");
console.log(config);
//拦截之后会停下来,要继续放下走,让他返回,需要return
return config;
},
(err) => {
// 失败返回错误
//错误回调
return Promise.reject(error);
}
);
//拦截器的错误返回不能用catch!!!
响应方向的拦截(第一个是拦截,第二个是错误回调)
this.axios.interceptors.response.use(
(config) => {
console.log("响应拦截器");
console.log(config);
//拦截之后会停下来,要继续放下走,让他返回,需要return
return config;
},
(err) => {
// 失败返回错误
//错误回调
console.log("响应方向失败");
return Promise.reject(error);
}
);
2.使用axios实例与拦截器结合
先实例:
// //实例对象与拦截器配合使用
// //实例对象.interceptors.request.use() 请求拦截器
//先实例->拦截器->发送axios请求
let newvar2 = this.axios.create({
baseURL: "/api/cunluo",
timeout: 5000,
});
拦截器:
请求方向的拦截:
newvar2.interceptors.request.use(
(config) => {
console.log("进入请求拦截器");
console.log(config);
//拦截之后会停下来,要继续放下走,让他返回,需要return
return config;
},
(err) => {
// 失败返回错误
//错误回调
return Promise.reject(err);
}
);
响应方向的拦截:
newvar2.interceptors.response.use(
(config) => {
console.log("进入响应拦截器");
console.log(config);
//拦截之后会停下来,要继续放下走,让他返回,需要return
return config;
},
(err) => {
// 失败返回错误
//错误回调
return Promise.reject(err);
}
);
发送axios请求:
// axios实例来请求;
//实例对象
newvar2({
method: "post",
url: "/userinfo/unintercept/userinfoLogin",
}).then((res) => {
console.log(res);
});
七、axios在vue中的模块封装
第一种:用变量传递
新建一个js文件
//封装位置
import axios from "axios";
export function request(config, success, fail) {
// axios({
// url: config,
// method: 'post'
// }).then(res => {
// success(res);
// }).catch(err => {
// fail(err)
// })
}
//调用者位置(vue中,在main.js文件中调用)
import {request} from './network/request/request'
request('/userinfo/unintercept/userinfoLogin',res=>{
console.log(res)
},err=>{
console.log(err)
})
第二种:用对象参数
//封装位置
import axios from "axios";
//第二种封装方法,用对象传递
export function request(config) {
axios({ url: config.url, method: 'post' }).then(res => {
config.success(res);
}).catch(err => {
config.fail(err)
})
}
//调用者位置(vue中,在main.js文件中调用)
//第二种调用方式,用对象传递
import {request} from './network/request/request'
request({
url: '/api/cunluo/userinfo/unintercept/userinfoLogin',
success: res => {
console.log(res)
}, fail: err => {
console.log(err)
}
})
第三种:对象传递,用Promise封装axios实例
//第三种封装方法
export function request(config) {
let newVar = axios.create({
baseURL: "/api/cunluo/userinfo/unintercept",
timeout: 5000,
method: 'post'
});
//返回的是promise值
return new Promise((resolve, reject) => {
newVar(config.url)
}).then(res => {
console.log(res)
resolve(res)
})
.catch(err => {
console.log(err)
reject(err)
})
}
//注意回调then和catch的位置,紧跟promise后面
// 第三种调用方式
//成功发送了axios
request({
// url: '/api/cunluo/userinfo/unintercept/userinfoLogin'
url:'userinfoLogin'
}).then(res=>{
console.log(res);
}).catch(err=>{
console.log(err)
})
第四种:最推荐使用最后一种封装方法!用对象传参
//第四种封装方法
export function request(config) {
// axios实例创建完后,返回的就是一个promise
//axios本身就是一个promise
let newVar = axios.create({
baseURL: "/api/cunluo/userinfo/unintercept",
timeout: 5000,
method: 'post'
});
return newVar(config)
}
// 第四种调用方式
request({
url:'userinfoLogin'
}).then(res=>{
console.log(res)
})