SOURCE

一、Axios是什么?
Axios是一个基于Promise的http客户端,可用于浏览器和Node.js环境。它是对原生XHR的封装,提供了更简洁、强大的API
二、核心特点
✅ 基于Promise-支持async/await,避免回调地狱
✅ 同构应用-浏览器和 Node.js 通用
✅ 拦截器机制-可全局处理请求/响应
✅ 自动转换JSON-无需手动调用 .json()
✅ 请求取消-支持取消正在进行的请求
✅ 超时设置-可配置请求超时
✅ 进度监控-支持上传/下载进度
✅ XSRF防护-跨站请求伪造防护
✅ 错误处理-HTTP错误自动抛异常
二、为什么要用Axios,和XHR和Fecth的对比
//原生XHR方式,缺点:代码冗长,回调嵌套,需要手动处理 JSON
function xhrRequest() {
    const xhr = new XMLHttpRequest()
    xhr.open('GET','http://xxxx',true)
    xhr.setRequestHeader('Content-Type','application/json')

    xhr.onreadystatechange = function() {
        if(xhr.readyState === 4 && xhr.statue === 200) {
            const data = JSON.parse(xhr.responseText) 
            console.log('成功返回数据:',data)
        }else {
            console.log('失败:',xhr.responseText)
        }
    }
    xhr.onerror = function() {
        console.error('请求失败')
    }
    xhr.send()

}

//Fetch方式(原生Promise),缺点:需要手动检查response.ok,需要手动调用.json(),需要手动实现超时
async function fetchRequest() {
    try {
        const response = await fetch('url',{
            method:'post',
            headers: {
                'Content-Type': 'application/json'
            }
        })
        if(!response.ok) {
            throw new Error(`网络请求失败${response.status}`)
        }
        const data = await response.json()
        console.log('成功返回数据:',data)

    }catch(error) {
        consoel.log('错误:',error)

    }
}
//Axios方式,优点:代码简洁,自动处理 JSON,错误处理自动化
import axios from 'axios'

async function axiosRequest() {
    try{
       const response = await axios.post('url',{
        headers: {
            'Content-Type': 'application/json'
        },
        data: {
              firstName: 'Finn',
    lastName: 'Williams'
        }
       })
       //自动解析json,直接使用response.data
        console.log('成功返回数据:',response.data)
        console.log('状态码:',response.status)
        console.log('响应头:',response.headers)

    }catch(error) {
        //http错误自动进入catch
        console.log('错误:',error)

    }

}
//axios不用async和await
axios.get('/api/user/123')
  .then(function (response) {
    // 请求成功,处理响应数据 response.data
    console.log(response.data);
  })
  .catch(function (error) {
    // 请求失败,处理错误
    console.error('出错啦!', error);
  });

//Axios高级配置
//(1)创建Axios实例(推荐方式)
const apiClient = axios.create({
    baseURL: 'https://xxxx',//基础URL
    timeout: 10000, //超时时间10s
    headers: {
        'Content-Type':'application/json'
    }

})

//使用axios实例发送请求
async function useInstance() {
    //请求会自动拼接baseURL
    const response = await apiClient.get('/user/123')
    consoel.log(response.data)
}

//(2)请求拦截器
apiClient.interceptors.request.use(
    config=>{
        //在发送请求之前做些什么
        //统一添加身份认证令牌
        const token = localStorage.getItem('token')
        if(token) {
            config.headers.Authorization = `Bearer ${token}`
        }
        return config
    },
    error=>{
        //对请求错误做些什么
        return Promise.reject(error)
    }
)

//(3)响应拦截器
apiClient.interceptors.response.use(
    response =>{
        //对响应数据做点什么
        return response.data
    },
    error=>{
        //对响应错误做点什么
         if (error.response && error.response.status === 401) {
         // 跳转到登录页
         window.location.href = '/login';
         }
    return Promise.reject(error);
    }
)

axios是如何解决CSRF防护-跨站请求伪造防护
axios 通过自动读取 cookie 中的 XSRF token 并将其添加到请求头中来防护 XSRF 攻击
过程如下:
服务器:
   1.当用户登录成功后,服务器生成一个随机的 CSRF Token,
   2.并通过 Set-Cookie 响应头将其发送给浏览器

Axios会自动:
   1. 从 Cookie 中读取 XSRF-TOKEN 的值
   2. 将其添加到 X-XSRF-TOKEN 请求头中
   3. 一起发送给服务器

服务器:
   1. 从请求的 Cookie 中读取 XSRF-TOKEN 的值
   2. 从请求头 X-XSRF-TOKEN 中读取值
   3. 比对两个值是否一致
console 命令行工具 X clear

                    
>
console