安装 axios
工具 | 命令 |
---|---|
npm | npm install axios |
bower | bower install axios |
yarn | yarn add axios |
官网这里还提供了两种CDN接入的方式
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
但我估计这是国外的, 速度上可能不及国内源, 我在 bootcdn 上找了一个版本 0.19.2
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.js"></script>
.
在项目中导入 axios
ES6语法引入
import axios from 'axios'
CommonJS 引入
const axios = require('axios');
官网在这里好像更推荐使用 CommonJS 去引入, 原因是这样做可以得到由TypeScript的语法支持,用于自动代码提示
.
简单的使用 axios
- 方式一 : **axios( config ) **
config : 针对于请求的一些配置选项, 该参数为一个对象
axios({
// method 请求类型
method: 'post',
// 请求路径
url: '/user/12345',
// post 携带数据
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
- 方式二 : axios(url)
也可以省略 config 对象, 直接填入一个url。 但在此情况下就只能发送最简单的 get 请求了
axios('/user/12345');
由于请求的类型有很多种, 为此axios提供了一整套用于不同请求的语法糖
- axios.get(url[, config])
- axios.delete(url[, config])
- axios.head(url[, config])
- axios.options(url[, config])
- axios.post(url[, data[, config]])
- axios.put(url[, data[, config]])
- axios.patch(url[, data[, config]])
这样在其config配置中可以省略 method 属性
需要注意的是 在使用不同请求的时候 携带参数的方式是不同的, 例如 get , 需要在config 中使用 params 属性传参
,post、put、patch方法则需要使用data属性
axios发送请求后返回的是一个promise对象, 我们可以直接使用then获取其返回数据, 类似下面这样
axios.get('/user?ID=12345')
.then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error);
})
.then(function () {
// always executed
});
如果你愿意, 官网这里也推荐使用 async/await
async function getUser() {
try {
const response = await axios.get('/user?ID=12345');
console.log(response);
} catch (error) {
console.error(error);
}
}
官网这里提示: 如果使用了async/await的话需要注意有些浏览器并不支持该语法。 例如 IE 和 一些老版本的浏览器
.
config 请求配置项
下面列出config对象的可用配置项, 其中只有 url 是必填项。 如果没有指定method, 则默认为get请求
属性名 | 值类型 | 默认值 | 是否必填 | 解释说明 |
---|---|---|---|---|
url | String | 无 | 是 | 请求路径 |
method | String | "get" | 否 | 请求类型。有get、delete、head、options、post、put、patch等 |
baseURL | String | 无 | 否 | 请求主机,将会和url相拼接, 形成完整路径 |
transformRequest | Array(functon(data,header)...) | 无 | 否 | 用于在请求在发送到服务器之前对请求数据做一些修改。但是前提是只能在'PUT', 'POST', 'PATCH' ,'DELETE' 请求中使用。并且数组中的最后一个函数必须返回一个String 或 Buffer 或 ArrayBuffer 或 FormData 或 Stream。 |
transformResponse | Array(functon(data)...) | 无 | 否 | 用于响应接收之前对响应数据做一些修改。列表中函数接收一个参数data,是从服务器请求来的数据,可以在此处对其做一些修改。 然后你必须也要返回一个data |
headers | Object | 无 | 否 | 用于设置请求头 |
params | Object | 无 | 否 | 拼接在url后面的参数列表。通常get方法传递参数采用此属性。当然get方法也可以直接在url后面拼接,但是拼接后的url及其的长且不优雅, 还是推荐params方式 |
paramsSerializer | Function(params) | 无 | 否 | 用于序列化params对象, 返回一个序列化后的params对象(字符串) |
data | Object | 无 | 否 | data数据主要作为请求体 |
data | String | 无 | 否 | data的另一种写法。 eg:'Country=Brasil&City=Belo Horizonte' 这里只有值会被发送出去,键则不会被发送 |
timeout | Number | 0(无超时时间) | 否 | 用于设置超时时间,单位毫秒。默认为0, 代表不设置超时时间, 而不是超时时间为0秒。 |
withCredentials | Boolean | false | 否 | 是否使用证书 |
adapter | Function(config) | 无 | 否 | 拦截器。常用于测试中, 该函数接收一个config配置对象。 并且该函数必须返回一个promise或者一个有效的响应 |
auth | {username, password} | 无 | 否 | 用于提供HTTP身份验证 |
responseType | String | "json" | 否 | 设置响应数据类型,可以为 'arraybuffer', 'document', 'json', 'text', 'stream'
|
responseEncoding | String | "utf8" | 否 | 响应数据编码 (Node.js only) |
xsrfCookieName | String | "XSRF-TOKEN" | 否 | Cookie中csrf值所对应的键的名称 |
xsrfHeaderName | String | "X-XSRF-TOKEN" | 否 | 请求头中带有xsrf token值的键的名字 |
onUploadProgress | Function(progressEvent) | 无 | 否 | 用于处理上传进程的回调 |
onDownloadProgress | Function(progressEvent) | 无 | 否 | 用于处理下载进程的回调 |
maxContentLength | Number | 无 | 否 | 限制http响应的最大字节数 |
maxBodyLength | Number | 无 | 否 | 限制请求体的最大字节数 |
validateStatus | Function(status) | 无 | 否 | 提前拿到服务器相应过来的状态信息。如果该函数返会True或者null或者undefined, 则axios返回的promise状态则会被更改为resolved。 如果该函数返会false, 则该promise状态变为rejected |
maxRedirects | Number | 5 | 否 | 定义最大重定向请求数 |
socketPath | Object | null | 否 | 用于定义 UNIX 套接字路径 |
httpAgent | Object | new http.Agent({ keepAlive: true }) | 否 | 用于设置http代理 |
httpsAgent | Object | new https.Agent({ keepAlive: true }) | 否 | 用于设置https代理 |
proxy | Object | 无 | 否 | 用于设置请求代理 |
cancelToken | Object | 无 | 否 | 取消某个请求的令牌 |
decompress | Boolean | true | 否 | 解压缩。 是否对请求体进行压缩处理, 默认压缩处理。其中XHR无法关闭压缩 |
.
响应数据包
当我们的请求发出后,服务器响应返回一些数据。该数据会被axios封装成一个大对象。我们可以使用then拿出这些数据
axios.get('/user/12345')
.then(function (response) {
console.log(response.data);
console.log(response.status);
console.log(response.statusText);
console.log(response.headers);
console.log(response.config);
});
其中 data 属性则是真正服务器传回的数据, 其余属性则是axios封装的一些属性。 具体请看下表
属性名 | 类型 | 解释说明 |
---|---|---|
data | Object | 由服务器真正返回的数据 |
status | Number | 状态码。常见的HTTP状态码,用于表示响应状态。 eg : 200表示请求成功
|
statusText | String | 状态信息,用于描述状态码的可读文字。 eg : "OK" , 对应status 200
|
headers | Object | 响应头。所有的键名都是小写的 |
config | Object | 配置信息, 也就是发送请求时候的config选项 |
request | Object | 生成此次响应的请求对象 |
.
执行多个并发请求
1. Promise.all
最初官网推荐了 Promise.all 方法 ( 现已不推荐使用 ), 并举例如下
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
Promise.all([getUserAccount(), getUserPermissions()])
.then(function (results) {
const acct = results[0];
const perm = results[1];
});
2. axios.all
但后来, axios也推出了自己的 all 方法 axios.all
, 并使用 axios.spread
接收其数据
它和 promise.all 的使用方法差不多 。
axios.all(
[
axios.get('/test1'),
axios.get('/test2')
]
).then(
axios.spread( (test1Res,test2Res) => {
console.log(test1Res,test2Res)
})
)
.
全局默认配置
当我们总是向同一个服务器发送请求的时候, config项中的baseURL永远都是同一个, 类似的还有一些其他属性, 如超时时间, 响应头信息。
该配置适用于给所有请求添加一些相同的config项
配置全局默认配置项需要使用引入的axios对象身上的defaults
对象
import axios from 'axios'
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';
defaults 对象拥有几乎完整的config属性。 将会和所有请求项中的config合并(类似 Object.assign 操作)完成属性的覆盖