承接昨天的日志,问到ajax,怎么可能不问axios呢。
正文
这虽然是一次模拟面试,但当模拟真的开始的时候,我开始汗流浃背了。
1 | 面试官:能详细说说axios吗? |
虽然知道今年很卷,但是比想象中要卷的多。
本节为 Axios 常规使用,更多方法请看Axios中文文档、Axios中文文档(官方)、开源API库:BootCDN
Axios概念
Axios 是一个基于 promise 的网络请求库,作用于 node.js 和浏览器中,它是 isomorphic 的 (即同一套代码可以运行在浏览器和 node.js 中)。
在服务端它使用原生 node.js http 模块,而在客户端 (浏览端) 则使用 XMLHttpRequest
- Axios 本质上是对原生 XMLHttpRequest 的封装,只不过它是 Promise 的实现版本,符合最新的 ES6 规范
Promise教程请参考:juejin.cn/post/732199…
主要特点:
- 从浏览器创建 XMLHttpRequests、从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求和响应数据
- 取消请求
- 超时处理
- 自动将请求体序列化
- 自动转换 JSON 数据
使用方式
安装
- 使用 npm
1 | npm install axios |
- 使用 CDN
1 | <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> |
基本使用
可以向 axios
传递相关配置来创建请求
axios(config)
1 | // 发起一个get请求, 参数名和值会自动拼接到url |
常用请求方法:
请求方法 | 操作 |
---|---|
GET | 获取数据 |
POST | 提交数据 |
PUT | 修改数据(全部) |
DELETE | 删除数据 |
PATCH | 修改数据(部分) |
为方便起见,为所有支持的请求方法提供了别名:
无 data 属性:
axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.options(url[, config])
有 data 属性:
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])
axios.postForm(url[, data[, config]])
axios.putForm(url[, data[, config]])
axios.patchForm(url[, data[, config]])
别名中的data属性无需显式给出,只需传入一个对象即可
下面是使用方法别名的示例:
- GET 请求
1 | axios.get('/user', { |
- POST 请求
1 | js复制代码// data属性直接为一个对象, 无需显式给出 |
取消请求
Axios 支持以 fetch API 方式—— AbortController
取消请求
1 | js复制代码const controller = new AbortController(); |
请求配置
以下是创建请求时可以用的配置选项只有 url
是必需的。如果没有指定 method
,请求将默认使用 GET
方法
配置源于官网,已将常用配置移到最前
1 | { |
响应结构
一个请求的响应包含以下结构:
1 | { |
Axios默认配置
常规开源项目中的常见封装方式。
全局默认配置
1 | axios.defaults.baseURL = 'https://api.example.com' |
自定义实例
可以使用自定义配置新建一个实例:axios.create([config])
1 | // 创建实例时配置默认值 |
配置优先级
配置将会按优先级进行合并
- 优先级:lib/defaults.js默认值 < 实例
defaults
属性 < 请求config
参数
1 | js复制代码// 使用库提供的默认配置创建实例 |
拦截器
在请求或响应被 then 或 catch 处理前拦截它们
1 | js复制代码// 请求拦截器 |
拦截器完整使用示例:
1 | js复制代码// 创建一个单独的axios实例 |
如果需要移除拦截器,可以这样:
1 | const myInterceptor = axios.interceptors.request.use(function () {/*...*/}) |
结语
面向面试开发的感觉,这些东西平日用的太顺手,整理出来甚至也不算细究,只是调用别人的工具方法。
但是在面试时候问出来,真是有一种。。。。无趣的感觉。
累了,这次单纯是为了面试整理了一下知识点,后续大概不会持续关注这种工具方法。