Axios的基本使用

545 阅读4分钟

Axios是一个基于Promise的网络请求库,作用于node.js和浏览器中。它能做到以下几个特点:

  • 发送请求
  • 拦截请求和响应数据
  • 取消请求
  • 自动转换JSON数据
    下面是他的具体用法:

发送请求

在Axios中发送请求有两种方法,第一种是通过具体请求的方法发送,第二种是使用传递配置对象发送

通过具体请求方法发送

比如说想要发送一个get请求,就可以这样

//引入axios
const axios = require('axios');

// 向给定ID的用户发起请求
axios.get('/user?ID=12345')

//当然这里也可以写成这种方式
axios.get('/user', {
    params: {
      ID: 12345
    }
  })

以上两种方式是等价的,都是发送一个get请求,并且有一个查询参数ID为12345
如果想要发送其他方法的请求也是同理

axios.post()
axios.delete()
axios.patch()
...

使用传递配置对象的方式发送

这里发送一个post请求

axios({
  method: 'post',
  url: '/user/12345'
});

//这样就会向'/user/12345'发送一个post请求

以上两种方式发送完请求后,会返回一个promise对象,我们就可以通过then、catch等Promise方法来捕获数据了。
需要注意的是,所有的方法中,url是必须的,如果在配置中没有写具体的请求方法,axios默认会以get方法发送请求。

创建实例

可以通过axios.create()来创建一个实例,这个实例会将你自己的配置覆盖axios的默认配置,并且每次使用这个实例发送请求时,都会使用你自己的配置。

const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

这个instance实例也可以使用上面的两种方法发送请求

请求配置

下面是常用的请求配置

{
  // `url` 是用于请求的服务器 URL
  url: '/user',

  // `method` 是创建请求时使用的方法
  method: 'get', // 默认值

  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  baseURL: 'https://some-domain.com/api/',

  // 自定义请求头
  headers: {'X-Requested-With': 'XMLHttpRequest'},

  // `params` 是与请求一起发送的 URL 参数
  // 必须是一个简单对象或 URLSearchParams 对象
  params: {
    ID: 12345
  },

  // `data` 是作为请求体被发送的数据
  // 仅适用 'PUT', 'POST', 'DELETE 和 'PATCH' 请求方法
  // 在没有设置 `transformRequest` 时,则必须是以下类型之一:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - 浏览器专属: FormData, File, Blob
  // - Node 专属: Stream, Buffer
  data: {
    firstName: 'Fred'
  },
  
  // 发送请求体数据的可选语法
  // 请求方式 post
  // 只有 value 会被发送,key 则不会
  data: 'Country=Brasil&City=Belo Horizonte',

  // `timeout` 指定请求超时的毫秒数。
  // 如果请求时间超过 `timeout` 的值,则请求会被中断
  timeout: 1000, // 默认值是 `0` (永不超时)

  // `proxy` 定义了代理服务器的主机名,端口和协议。
  // 您可以使用常规的`http_proxy` 和 `https_proxy` 环境变量。
  // 使用 `false` 可以禁用代理功能,同时环境变量也会被忽略。
  // `auth`表示应使用HTTP Basic auth连接到代理,并且提供凭据。
  // 这将设置一个 `Proxy-Authorization` 请求头,它会覆盖 `headers` 中已存在的自定义 `Proxy-Authorization` 请求头。
  // 如果代理服务器使用 HTTPS,则必须设置 protocol 为`https`
  proxy: {
    protocol: 'https',
    host: '127.0.0.1',
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  }
}

更多的配置可以在Axios文档上面看到 Axios中文文档

拦截器

拦截器的作用是在请求或响应在被then或catch处理前拦截它们
拦截器有两种,分别为:请求拦截器响应拦截器

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

如果需要移除拦截器,可以使用eject方法

const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

需要注意的是,如果有多个拦截器共同使用,请求拦截器和响应拦截器的响应时机会有所不同,具体为:

  • 请求拦截器,越晚声明,越早执行
  • 响应拦截器,越晚声明,越晚执行

取消请求

axios提供了两种取消请求的方式,分别为:

  • AbortController
  • CancelToken 但是在新版本的Axios中CancelToken被弃用了,Axios也推荐我们使用AbortController。
    具体用法为:
const controller = new AbortController();

axios.get('/foo/bar', {
   signal: controller.signal
}).then(function(response) {
   //...
});
// 取消请求
controller.abort()

也就是说,需要创建一个AbortController实例,并且在axios的配置对象中设置signal实例上的signal方法,如果需要取消请求,就可以调用controller.abort()就可以了。
该方法的原理是使用了AbortController方法,可以去了解一下。MDN