1、是什么?

axios 它的底层是用了 XMLHttpRequest(xhr)方式发送请求和接收响应,xhr 相对于之前讲过的 fetch api 来说,功能更强大,但由于是比较老的 api,不支持 Promise,axios 对 xhr 进行了封装,使之支持 Promise,并提供了对请求、响应的统一拦截功能

2、能干啥?

axios可以用于从浏览器和Node.js应用程序中发送HTTP请求和接收响应数据。它可以用于以下操作:

  • 发送GET,POST,PUT,DELETE等HTTP请求
  • 检查HTTP响应状态码以确定请求是否成功或失败
  • 获取HTTP响应体中的数据
  • 将响应数据转换为JSON格式的数据
  • 检查HTTP请求和响应的头信息和身份验证
  • 发送JSON格式的数据作为HTTP请求体

除此之外,axios还提供了一些其他功能,例如:

  • 设置请求头信息
  • 设置响应体的格式和编码方式
  • 发送JSON格式的数据作为URL参数
  • 将HTTP请求和响应的详细信息记录到日志中
  • 支持Promise和async/await的异步编程风格

总之,axios是一个非常强大和灵活的HTTP库,可用于各种不同的应用程序和场景。

3、怎么玩?

安装

npm install axios -S

导入

import axios from 'axios'

4、方法

请求备注
axios.get(url[config])GET请求
axios.delete(url[config])DELETE请求
axios.head(url[config])HEAD请求
axios.options(url[config])OPTIONS请求
axios.post(url[data[config]])POST请求
axios.put(url[data[config]])PUT请求
axios.patch(url[data[config]])PATCH请求
  • config : 选项配置。例如:查询参数,请求头…
  • data : 请求体数据。最常见的是json格式数据
  • get、head : 这两种请求无法携带请求体
  • options、delete : 请求可以通过config中的data携带请求体

5、实战

异步

async fetchData() {
	axios.get('/api/user/list').then((res) => {
		console.log(res.data)
	})
}

同步

async fetchData() {
	const resp = await axios.get('/api/user/list')
	console.log(resp)
}

发送查询参数,携带请求头数据

async fetchData() {
	const resp = await axios.post(
		'/api/postHeader',
		{},
		{
			headers: {
				Authorization: 'token',
			},
		}
	)
	console.log(resp)
}

发送查询参数,特殊字符手动解析

async fetchData() {
	const name = encodeURIComponent('&&&')
	const age = 21
	const res = await axios.get(
		`/api/getParams?name=${name}&age=${age}`
	)
	console.log(res.data)
}

发送查询参数,特殊字符自动解析

async fetchData() {
	const res = await axios.get('/api/getParams', {
		params: {
			name: '&&&',
			age: 20,
		},
	})
	console.log(res.data)
}

使用请求体发送数据,格式为urlencoded

async fetchData() {
	const params = new URLSearchParams()
	params.append('name', 'zs')
	params.append('age', 20)
	const res = await axios.post('/api/getParamsPost', params)
	console.log(res.data)
}

使用请求体发送数据,格式为multipart

async fetchData() {
	const params = new FormData()
	params.append('name', 'ly')
	params.append('age', 25)
	const res = await axios.post('/api/getParamsPost', params)
	console.log(res.data)
}

使用请求体发送数据,格式为JSON

// JSON.stringify()
async fetchData() {
	const o = {
		name: '&&&',
		age: 20,
	}
	const res = await axios.post('/api/getJSONPost', o)
	console.log(res.data)
}

6、自定义axios实例

前面我们使用的是axios的默认配置项
下面我们手动创建axios实例,并指定相关配置项,覆盖默认的配置项

const _axios = axios.create(config)

config配置项如下

名称含义
baseUrl将自动加载url前面
headers请求头,类型为简单对象
params跟在url后面的参数,类型为简单的对象或URLSearchParams
data请求体,类型有简单对象、FromData、URLSearchParams、File等
withCredentials跨域时是否携带Cookie等凭证,默认为false
responseType响应类型,默认为json
const _axios = axios.create({
	baseURL:'/api',
	headers:{}
});
const res = _axios.get("/students", {
	name: 'zs',
	age: 19
});
console.log(res)

6、axios的拦截器

请求拦截器

const _axios = axios.create({
        baseURL: '/api',
        headers: {}
      });

_axios.interceptors.request.use(
	// 请求正常执行的函数
	config => {
		config.headers={
			Authorization:'x.y.z'
		}
		return config;
	},
	// 请求异常执行的函数
	error => {
		return Promise.reject(error)
	}
)

响应拦截器

_axios.interceptors.response.use(
	// 响应正常执行的函数
	resp => {

		return resp
	},
	// 响应异常执行的函数
	error => {
		if(error.response.status === 401){
			console.log("aaaa")
			return Promise.resolve(400); // 处理异常
		}
		// ......
		return Promise.reject(error)
	}
)

7、抽取通用的axios配置

import axios from 'axios'
const _axios = axios.create({
    // baseURL: 'http://localhost:8080',
    withCredentials: true
});

// 9. 拦截器
_axios.interceptors.request.use(
    function (config) {
        // 比如在这里添加统一的 headers
        config.headers = {
            Authorization: 'aaa.bbb.ccc'
        }
        return config;
    },
    function (error) {
        return Promise.reject(error);
    }
);

_axios.interceptors.response.use(
    function (response) {
        // 2xx 范围内走这里
        return response;
    },
    function (error) {
        if (error.response?.status === 400) {
            console.log('请求参数不正确');
            return Promise.resolve(400);
        } else if (error.response?.status === 401) {
            console.log('跳转至登录页面');
            return Promise.resolve(401);
        } else if (error.response?.status === 404) {
            console.log('资源未找到');
            return Promise.resolve(404);
        }
        // 超出 2xx, 比如 4xx, 5xx 走这里
        return Promise.reject(error);
    }
);

export default _axios;

这样在其他需要使用的地方直接import即可

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐