# axios

# 1. 为什么选择axios

  • 在浏览器中发送 XMLHttpRequests 请求
  • 在 node.js 中发送 http请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据

# 2. axios请求方式

  • axios(config)
  • axios.request(config)
  • axios.get(url[, config])
  • axios.delete(url[, config])
  • axios.head(url[, config])
  • axios.post(url[, data[, config]])
  • axios.put(url[, data[, config]])
  • axios.patch(url[, data[, config]])

# 3. 请求演示

import axios from 'axios'

// 1. 没有参数
axios.get('http://152.136.185.210:8000/api/z8/category').then(res => {
  console.log(res);
}).catch(err => {
  console.log(err);
})

// 2. 有请求参数
axios.get('http://152.136.185.210:8000/api/z8/home/data',
  {params: {type: 'sell', page: 1}})
  .then(res => console.log(res))
  .catch(err => console.log(err))

# 4. 发送并发请求

  • 有时候, 我们可能需求同时发送两个请求

    • 使用axios.all, 可以放入多个请求的数组.
    • axios.all([]) 返回的结果是一个数组,使用 axios.spread 可将数组 [res1,res2] 展开为 res1, res2
    import axios from 'axios'
    
    // 3. 发送并发请求
    axios.all([axios.get('http://152.136.185.210:8000/api/z8/category'),
      axios.get('http://152.136.185.210:8000/api/z8/home/data',
        {params: {type: 'sell', page: 3}})])
        .then(axios.spread((res1, res2) => {
          console.log(res1);
          console.log(res2);
        }))
    

# 5. 全局配置

  • 在上面的示例中, 我们的BaseURL是固定的

    • 事实上, 在开发中可能很多参数都是固定的.
    • 这个时候我们可以进行一些抽取, 也可以利用axiox的全局配置、
    import axios from 'axios'
    
    // 4. 全局配置
    axios.defaults.baseURL = 'http://152.136.185.210:8000/api/z8/';
    axios.all([axios.get('category'),
      axios.get('home/data',
        {params: {type: 'sell', page: 3}})])
        .then(axios.spread((res1, res2) => {
          console.log(res1);
          console.log(res2);
        }))
    

# 6. 常见的配置选项

  • 请求地址 url: '/user',
  • 请求类型 method: 'get',
  • 请根路径 baseURL: 'http://www.mt.com/api',
  • 请求前的数据处理 transformRequest:[function(data){}],
  • 请求后的数据处理 transformResponse: [function(data){}],
  • 自定义的请求头 headers:{'x-Requested-With':'XMLHttpRequest'},
  • URL查询对象 params:{ id: 12 },
  • 查询对象序列化函数 paramsSerializer: function(params){ }
  • request body data: { key: 'aa'},
  • 超时设置s timeout: 1000,
  • 跨域是否带Token withCredentials: false,
  • 自定义请求处理 adapter: function(resolve, reject, config){},
  • 身份验证信息 auth: { uname: '', pwd: '12'},
  • 响应的数据格式 json / blob /document /arraybuffer / text / stream responseType: 'json',

# 7. axios的实例

  • 为什么要创建axios的实例呢?

    • 当我们从axios模块中导入对象时, 使用的实例是默认的实例.
    • 当给该实例设置一些默认配置时, 这些配置就被固定下来了.
    • 但是后续开发中, 某些配置可能会不太一样.
    • 比如某些请求需要使用特定的baseURL或者timeout或者content-Type等.
    • 这个时候, 我们就可以创建新的实例, 并且传入属于该实例的配置信息.
    import axios from 'axios'
    
    // 5.axios实例
    const axiosInstancce = axios.create({
      baseURL: 'http://152.136.185.210:8000/api/z8/',
      timeout: 5000,
      beaders: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    })
    
    axiosInstancce({
      url: '/category',
      method: 'get'
    }).then(res => {
      console.log(res);
    }).catch(err => {
      console.log(err);
    })
    

# 8. axios的封装

  • 为什么需要封装

    • 如果不封装的话,我们就需要在每一个js文件中引入axios,一旦asios框架出现问题,我们就需要修改每一个js文件,如果使用封装的话,我们只需要修改封装后的js文件即可
    import axios from 'axios'
    
    export default function request(option) {
      // 1. 创建axios实例
      const axiosInstance = axios.create({
        baseURL: 'http://152.136.185.210:8000/api/z8/',
        timeout: 5000,
        beaders: {
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      });
    
      // 2. 传入对象进行网络请求
      return axiosInstance(option)
    }
    
    import requet from './network/request'
    
    // 6. axios封装请求
    requet('/category').then(res => {
      console.log(res);
    }).catch(err => {
      console.log(err);
    })
    

# 9. 拦截器

  • axios提供了拦截器,用于我们在发送每次请求或者得到相应后,进行对应的处理。

    import axios from 'axios'
    
    export default function request(option) {
      // 1. 创建axios实例
      const axiosInstance = axios.create({
        baseURL: 'http://152.136.185.210:8000/api/z8/',
        timeout: 5000,
        beaders: {
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      });
    
      // 2. 配置请求和响应拦截
      axiosInstance.interceptors.request.use(config => {
        console.log('来到了request拦截success中');
        // 1. 当发送网络请求时,在页面中添加一个loading组件,作为动画
        // 2. 某些请求要求用户必须登陆,判断用户是否有token,如果没有token跳转到login页面
        // 3. 对请求的参数进行序列化
        // config.data = qs.stringify(config.data)
        // console.log(config);
        // 如果这里不返回config请求将不继续进行
        return config;
      }, err => {
        return err;
      })
    
      axiosInstance.interceptors.response.use(response => {
        // 响应成功的拦截中,主要时对数据进行过滤
        console.log('来到了response拦截success中');
        return response.data
      }, err => {
        // 响应的失败拦截中,可以根据status判断报错的错误码,跳转到不同的错误提示页面
        console.log('来到了response拦截fail中');
        return err
      })
    
      // 3. 传入对象进行网络请求
      return axiosInstance(option)
    }
    
Last Updated: 11/20/2024, 2:55:49 PM