Axios
是什么?Axios
是一个基于promise
的网络请求库,可用于node.js和浏览器中。它是isomorphic的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生node.js http模块,而在客户端(浏览器端)则使用XMLHttpRequests
。
XMLHttpRequests
,从node.js创建http请求XSRF
npm install axios
发起一个GET
请求
import axios from 'axios'
//axios.能够提供自动完成和参数类型推断功能
axios.get('/user?ID=12345').then(res => {
//处理成功
console.log(res.data)
}).catch(err => {
//处理错误情况
}).then(()=>{
//总会执行
})
//上述请求也可以按以下方式完成
axios.get('/user',{
params:{
ID:12345,
},
}).then().catch().then()
//支持async/await用法
//async/await是ECMAScript 2017中的一部分,而在IE和一些旧的浏览器中不支持,使用时要小心
async function getUser(){
try{
const res = await axios.get('/user?ID=12345')
console.log(res.data)
} catch(err){
console.log(err)
}
}
发起一个POST
请求
axios.post('/user',{
firstName:'Fred',
lastName:'Flintstone',
}).then(res => {
console.log(res.data)
}).catch(err => {
console.log(err)
}).then()
发起多个并发请求
function getUserAccount(){
return axios.get('/user/12345')
}
function getUserPermissions(){
return axios.get('/user/12345/permissions')
}
//Promise从哪里来?
Promise.all([getUserAccount(),getUserPermissions()]).then(res => {
const acct = results[0];
const perm = results[1];
})
可以向axios传递相关配置来创建请求
axios(config)
//发起一个post请求
axios({
method:'post',
url:'/user/12345',
data:{
firstName:'Fred',
lastName:'Flintstone',
}
})
axios(url,[,config])
//发起一个GET请求(默认请求方式)
axios('/user/12345')
您可以使用自定义配置新建一个实例
axios.create([config])
const instance = axios.create({
baseUrl:'https://some-domain.com/api/',
timeout:1000,
headers:{
'X-Custom-Header':'foobar',
},
})
这些是创建请求时可以用的配置选项。只有URL是必须的,如果没有指定method,请求将默认使用GET方法
{
//url是用于请求的服务器URL,
url:'/user',
//method是创建请求时使用的方法
method:'get',//默认值
//baseUrl将自动加在url前面,除非url是一个绝对url
//它可以通过设置一个baseURL便于为axios实例的方法传递相对URL
baseUrl:'https://some-domain.com/api/',
//transformRequest允许在向服务器发送前,修改请求数据
//它只能用于PUT,POST,PATCH这几个请求方法
//数组中最后一个函数必须返回一个字符串,一个Buffer实例,ArrayBuffer,FormData,或Stream
//你可以修改请求头
transformResponse:[data => {
//对接收的data进行任意转换处理
return data;
}],
//自定义请求头
headers:{
'X-Requested-With':'XMLHttpRequest',
},
//params是与请求一起发送的URL参数
//必须是一个简单对象或URLSearchParams对象
params:{
ID:12345,
},
//paramsSerializer是可选方法,主要用于序列化params
paramsSerializer:function(params){
return Qs.stringify(params,{
arrayFormat:'brackets',
})
},
//data是作为请求体被发送的数据
//仅适用put,post,delete,patch方法
//在没有设置transformRequest时,则必须是以下类型之一:
//string,plain object,ArrayBuffer,ArrayBufferView,URLSearchParams,
//浏览器专属 FormData,File,Blob
//Node专属 Stream,Buffer
data:{
firstName:'Fred',
},
//timeout指定请求超时的毫秒数
//如果请求时间超过timeout的值,则请求会被中断
timeout:1000,//默认值0,(永不过时)
//withCredentials表示跨域请求时是否需要使用凭证
withCredentials:false,//default
//adapter允许自定义处理请求,这使测试更加容易
adapter:function(config){
//
},
//auth HTTP Basic Auth
auth:{
username:'xxx',
password:'xxx',
},
//responseType表示浏览器将要相应的数据类型
//选项包括'arraybuffer','document','json','text','stream'
//浏览器专属:blob
responseType:'json',//默认值
//validateStatus定义了对于给定的HTTP状态码是resolve还是reject promise
//如果validateStatus返回true(或者设置为null或undefined),
//则promise将会resolve,否则rejected
validateStatus:function(status){
return status>=200 && status<300;//默认值
},
}
一个请求的响应包含以下信息
{
//data由服务器提供的响应
data:{},
//status来自服务器响应的HTTP状态码
status:200,
//statusText来自服务器响应的HTTP状态信息
statusText:'OK',
//headers是服务器响应头
//所有header名称都是小写,而且可以使用方括号语法访问
//例如response.headers['content-type']
headers:{},
//config是axios请求的配置信息
config:{},
//request是生成此响应的请求
//在node.js中它是最后一个ClientRequest实例
//在浏览器中则是XMLHttpRequest实例
request:{},
}
当使用then
时,您将接收如下响应
axios.get('/user/12345').then(res => {
console.log(res.data)
console.log(res.status)
console.log(res.statusText)
console.log(res.headers)
console.log(res.headers)
console.log(res.config)
})
当使用catch
,或者传递一个rejection callback作为then
的第二个参数时,响应可以通过error
对象使用。
您可以指定默认配置,它将作用于每个请求
axios.defaults.baseUrl = 'https://api.example.com'
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
//创建实例时配置默认值
const instance = axios.create({
baseUrl:'https://api/example.com',
})
//创建实例后修改默认值
instance.defaults.headers.common['Authorization'] = AUTO_TOKEN
配置将会按优先级进行合并,它的顺序是,在lib/defaults.js中找到的库默认值,然后是实例的defaults,最后是请求的conig
参数。后面的优先级要高于前面的。
//使用库提供的默认配置创建实例
//此时超时配置的默认值为0
const instance = axios.create()
//重写库的超时默认值
//现在所有使用此实例的请求超时时间为0.5s
instance.defaults.timeout = 2500
//重写此请求的超时时间,因为该请求需要更长时间
instance.get('/longRequest',{
timeout:5000
})
在请求或响应被then或catch处理签拦截它们
//添加请求拦截器
axios.interceptors.request.use(config => {
//在发送请求之前做些什么
return config
},err => {
//对请求错误做些什么
return Promise.reject(err)
})
//添加响应拦截器
axios.interceptors.response.use(res=>{
//2xx范围的状态码都会触发该函数
//对响应数据做点什么
return response
},err=>{
return Promise.reject(err)
})
如果你需要稍后移除拦截器,可以这样
const myInterceptor = axios.interceptors.request.use(/*...*/)
axios.interceptors.request.eject(myInterceptor);
可以给自定义的axios实例添加拦截器
const instance = axios.create();
instance.interceptors.request.use(/**/)
axios.get('/user/12345').then(res => {
console.log(res.data)
}).catch(err => {
//请求成功且服务器也响应了状态码,但状态码超出了2xx的范围
if(err.response){
console.log(err.response.data)
console.log(err.response.status)
console.log(err.response.headers)
}
//请求已经成功发起,但是没有收到响应
//error.request在浏览器中是XMLHttpRequest的实例,
//在node.js中是http.ClientRequest的实例
else if(err.request){
console.log(err.request)
}
//发送请求时出现问题
else{
console.log('Error',err.message)
}
console.log(err.config)
})
使用validateStatus
配置选项,可以自定义抛出错误的HTTP code
axios.get('/user/12345',{
validateStatus: status =>{
return status < 500; //处理状态码小于500的情况
}
})
使用toJSON
可以获取更多关于HTTP错误的信息
axios.get('/user/12345').then(res => {
console.log(res.toJSON())
}).catch(err => {
console.log(err.toJSON())
})
Axios支持以fetch API的方式,AbortController
取消请求
const controller = new AbortController();
axios.get('/foo/bar',{
signal:controller.signal
}).then(res => {
console.log(res.data)
})
//取消请求
controller.abort()
默认情况下,axios将js对象序列化为JSON,要以application/x-www-form-urlencoded格式发送数据,您可以使用以下选项之一。
const params = new URLSearchParams();
params.append('id','123')
params.append('username','xxx')
axios.post('/foo',params)
qs
库编码数据import qs from 'qs'
let data = {
id:'12345',
username:'xxx',
}
axios.post('/foo',qs.stringify(data))
qs
库编码数据