读 axios 笔记 (一)

原文连接

安装 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 操作)完成属性的覆盖

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。