axios的使用
安装
npm install axios --save
导入
在main.js中导入
import axios from 'axios'
使用axios
//使用axios
//axios自带promise,故可以用then
axios({
url: 'http://123.207.32.32:8000/home/multidata',
//默认情况下,也就是不写methods,就是get请求
method: 'get'
}).then(
res => {
console.log(res);
}
)
//虽然这个接口写在了下面,但是返回时,不知道谁先返回
axios({
url: 'http://123.207.32.32:8000/home/data?type=sell&page=3'
}).then(
res => {
console.log(res);
}
)
//上面的接口也可以这样写
axios({
url: 'http://123.207.32.32:8000/home/data',
//这写的是url的参数,专门针对get请求的参数拼接
params: {
type: 'pop',
page: 3
}
}).then(
res => {
console.log(res);
}
)
axios发送并发请求
axios.all([axios(),axios()]).then()
//axios发送并发请求
axios.all([axios({
url: 'http://123.207.32.32:8000/home/multidata',
}), axios({
url: 'http://123.207.32.32:8000/home/data',
params: {
type: 'sell',
page: 5
}
})]).then(results => {
console.log(results);
})
axios发送并发请求,分开展示
axios.all([axios({
url: 'http://123.207.32.32:8000/home/multidata',
}), axios({
url: 'http://123.207.32.32:8000/home/data',
params: {
type: 'sell',
page: 5
}
})]).then(axios.spread((res1, res2) => {
console.log(res1);
console.log(res2);
}))
全局配置
有些属性是一样的,我们可以进行公共处理
//全局配置
axios.defaults.baseURL = 'http://123.207.32.32:8000',
axios.defaults.timeout = 5000
//全局配置
axios.defaults.baseURL = 'http://123.207.32.32:8000',
axios.defaults.timeout = 5000
axios.all([axios({
url: '/home/multidata',
}), axios({
url: '/home/data',
params: {
type: 'sell',
page: 5
}
})]).then(axios.spread((res1, res2) => {
console.log(res1);
console.log(res2);
}))
常见的配置属性
params只针对get请求,对get请求进行拼接。
如果为post请求,相应的参数应该写在请求体里面的data中。
创建对应的axios的实例
对于全局创建组件,有些全局属性可能不一样,比如url,这时,全局属性就不是很好用了。
//对于不同参数的,进行创建不同实例
//创建对应的axios的实例
const instance1 = axios.create({
baseURl: 'http://123.207.32.32:8000',
timeout: 5000
})
//使用axios实例
instance1({
url: '/home/multidata'
}).then(res => {
console.log(res);
})
//另一个应用实例
instance1({
url: '/home/data',
params: {
type: 'pop',
page: 1
}
}).then(res => {
console.log(res);
})
//第二个实例
const instance2 = axios.create({
//这个url是和上面实例不同的,但是目前还没有别的接口。
baseURl: 'http://123.207.32.32:8000',
timeout: 10000,
//headers:{}
})
axios模块的封装
我们必须有对第三方框架经行封装的习惯,免得第三方框架不跟新,更改费劲。
好好补补回调的知识。
import axios from 'axios'
//第一种
//这里的参数success和failure是回调用的,这部分知识很薄弱,多补补。
export function request(config, success, failure) {
//1.创建axios对象
const instance = axios.create({
baseURL: 'http://123.207.32.32:8000',
timeout: 5000
})
//发送真正的网络请求
//别人给我们传入一个config,我们就要把config给instace传进去
instance(config).then(res => {
//这里已经回调了,所以没必要打印
//console.log(res);
success(res)
}).catch(err => {
// console.log(err);
failure(err)
})
}
封装好的文件的使用
//封装的网络请求的使用
//引入封装好的文件
import { request } from './network/request'
//第一种,要对应好
request({
url: '/home/multidata'
}, res => {
console.log(res);
}, err => {
console.log(err);
})
第二种使用方法
//第二种
export function request(config) {
//创建axios实例
const instance3 = axios.create({
baseURL: 'http://123.207.32.32:8000',
timeout: 5000
})
//发送真正的网络请求
insatace4(config.baseConfig).then(res => {
config.success(res);
}).catch(err => {
config.failure(err)
})
}
//第二种
request({
baseConfig: {
},
success: function(res) {
},
failure: function(err) {
}
})
axios的第三版原理写法
request.js
//最终的封装方法
export function request(config) {
return new Promise((resolve, reject) => {
//1.创建axios的实例
const instance = axios.create({
baseURL: 'http://123.207.32.32:8000',
timeout: 5000
})
//2.发送真正的网络请求
instance(config).then(res => {
resolve(res)
}).catch(err => {
reject(err)
})
})
}
在需要网络请求的文件中
//最终的请求方式的使用
request({
url: '/home/multidata'
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})
此时,我们根据源码知道,上面的封装还是比较多余。
最终简洁版
import axios from 'axios'
//最终方式的简化,因为源码就是返回的promise,故可以不用promise
export function request(config) {
//1.创建axios的实例
const instance = axios.create({
baseURL: 'http://123.207.32.32:8000',
timeout: 5000
})
//2.发送真正的网络请求
return instance(config)
}
如果哪天我们的框架不维护了,我们只需改我们的引入。但是在发送真正的网络请求那,就必须通过promise进行封装了。我们不用promise封装,是因为vue给我们封装好了。
axios拦截器
什么时候会用到拦截器
1.比如config中的一些信息不符合服务器要求。
2.比如每次发送网络请求时,都希望在界面上显示一个请求图标。
2.某些网络请求(比如登录(token)),必须携带一些特殊信息。
1.全局拦截axios.interctptors
2.instance为发送请求的对象
//拦截请求
instance.interceptors.request;
//拦截响应
instance.interceptors.response;
拦截器的使用
instance.interceptors.request.use(config => {
console.log(config);
return config
}, err => {
console.log(err);
})
注意
如果不写 return config
,则不会打印请求结果。会打印错误类型
// 2.2拦截响应
instance.interceptors.response.use(res => {
console.log(res.data);
return res.data
}, err => {
console.log(err);
})
注意
1.如果不返回响应结果,前面用到响应数据的地方,会报undefined
anxios完整的使用流程
request.js
//引入框架
import axios from 'axios'
export function request(config) {
//1.创建axios的实例
const instance = axios.create({
baseURL: 'http://123.207.32.32:8000',
timeout: 5000
})
//2.axios的拦截器
// 2.1拦截请求
instance.interceptors.request.use(config => {
console.log(config);
return config
}, err => {
console.log(err);
})
// 2.2拦截响应
instance.interceptors.response.use(res => {
console.log(res.data);
return res.data
}, err => {
console.log(err);
})
//3.发送真正的网络请求
return instance(config)
}
使用request的文件
//引入封装好的文件
import { request } from './network/request'
//最终的请求方式的使用
request({
url: '/home/multidata'
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})