Axios是一个基于promise的http网络请求库,可以用于浏览器和nodejs,在nodejs中使用http模块,而在浏览器使用XMLHttpRequests
支持promise api,支持拦截请求和响应,转换请求数据和响应数据,取消请求,自动转换json数据,支持防御XSRF攻击
安装
yarn add axios
实例demo
import axios from "axios";
axios.get("https://httpbin.org/get", {
params: {
name: "root"
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
axios.post("https://httpbin.org/post", {
name: "root",
pass: "root"
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
可以看到页面已经发送了get和post请求,.then和.catch分别表示请求成功和请求失败时调用的函数,也可以用箭头函数,其中response参数为请求的数据,error为错误信息
还可以写成这样
axios({
method: 'post',
url: 'https://httpbin.org/post',
data: {
name: "root",
pass: "root"
}
});
FormData方式
let data = {
home: "hallo",
main: "abc"
}
let formData = new FormData()
for(let key in data){
formData.append(key,data[key])
}
axios.post('https://httpbin.org/post',formData).then(
res =>{
console.log(res)
}
)
put和patch
let data = {
home: "hallo",
main: "abc"
}
axios.put("/put",data).then(res =>{
console.log(res)
})
axios.patch("/patch",data).then(res =>{
console.log(res)
})
delete请求
axios.delete("/delete",{
params: {
home: "hallo"
}
}).then(res =>{
console.log(res)
})
注意:params是在URL上使用,而data就不是在URL上使用(Request Payload)
并发请求(同时进行多个请求,并且统一处理返回值)
axios.all([
axios.get("https://httpbin.org/get"),
axios.get("/data.json")
]).then(
axios.spread((urlRes,dataRes)=>{
console.log(urlRes,dataRes)
})
)
注意:实质上进行请求的时候还是有个顺序的,具体顺序是看axios.all里面的数组元素,只是提供了统一管理请求而且
请求返回的数据,其中config是一些请求信息,包含请求方式,文件路径等等,请求到的真实数据实质上是在response.data里,还有像status(状态码),headers(请求头)等等都有
常见请求方式:get,post,put,patch,delete
put和patch一般是用来更新数据,区别就是put要将所有数据推送到后端,patch只将修改过的数据推送到后端,delete是用来删除数据,具体还得看后端怎么定义
params: 请求参数拼接到url中,data:请求参数放在请求体中
axios实例
let AxiosDemo = axios.create({
baseURL:"http://localhost:8080"
timeout: 1000
})
AxiosDemo.get("/demo.json").then(res =>{
console.log(res)
}
)
或者直接访问属性来定义
let instance = axios.create()
instance.default.timeout = 1000
instance.defaults.baseURL = 'http://localhost:8080'
当多个接口的超时时长(timeout)不同或者需要访问服务地址(服务请求或者响应的结构可能不同时)有多个的时候就可以使用实例化axios来自定义,超时(timeout)默认为1000毫秒,超出就返回超时401
也可以搞全局配置
axios.defaults.baseURL = 'http://localhost:8080'
axios.defaults.timeout = 1000
拦截器(请求或者响应被处理之前拦截)
请求拦截器
axios.interceptors.request.use(config =>{
return config
},err=>{
return Promise.reject(err)
})
可以看到有两个参数,第一个是发送请求前要进行处理什么东西的回调函数,另一个是在请求错误的时候应该处理什么的回调函数
响应拦截器
axios.interceptors.response.use(res =>{
return res
},err=>{
return Promise.reject(err)
})
可以看到有两个参数,第一个是当请求成功后对响应数据要进行处理什么东西的回调函数,另一个是在响应错误的时候应该处理什么的回调函数
取消拦截器
let interceptors = axios.interceptors.response.use(config =>{
config.headers.token = ""
return config
})
axios.interceptors.request.eject(interceptors)
注意:不要直接使用对象来声明一个属性的值,而是应该使用点来访问属性来定义,否则其他属性都会被覆盖掉,例如:
config.headers ={
auth: true
token = ""
}
取消请求
let source = axios.CancelToken.source()
axios.get("/data.json",{
cancelToken: source.token
}).then(res=>{
console.log(res)
}).catch(err=>{
console.log(err)
})
source.cancel("cancel http")
解决跨域问题
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}