• axios笔记


    1. 安装

    npm install axios --save
    

    2. 基本使用

    • 首先,导入axios

      import axios from 'axios'
      
    • 使用示例

      axios({
          url: 'http://123.207.44.32:8000/home/listdata',
          method: 'get'
      }).then(res => console.log(res))
      
      axios({
          url: 'http://123.207.32.32:8000/home/data?type=pop&page=1'
      }).then(resp => console.log(resp))
      
      // 等价于http://123.207.32.32:8000/home/data?type=pop&page=1
      axios({
          url: 'http://123.207.32.32:8000/home/data',
          // 针对get请求的参数拼接.
          params: {
              type: 'pop',
              page: 1
          }
      
      }).then(resp => console.log(resp))
      
      axios.get('http://123.207.32.32:8000/home/data', {
          params: {
              type: 'pop',
              page: 1
          }
      }).then(resp => console.log(resp))
      

    3. Axios发送并发请求

    • 发送并发请求的意思就是需要等请求1,请求2都返回结果之后,再进行之后的业务逻辑操作

    • 示例

      // 并发请求
      axios.all([
          axios.get('http://127.0.0.1:8080/a'),
          axios.get('http://127.0.0.1:8080/b')]
      ).then(results => console.log(results))  // results封装了两次请求的结果
      
      // axios提供了方法, 将两个请求的结果进行拆分
      axios.all([
          axios.get('http://127.0.0.1:8080/a'),
          axios.get('http://127.0.0.1:8080/b')
      
      ]).then(axios.spread((resp1,resp2)=> {
          console.log(resp1);  // 请求a接口的结果
          console.log(resp2);  // 请求b接口的结果
      }))
      

    4. 全局配置

    axios.defaults.baseURL = 'http://127.0.0.1:8080';
    axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
    
    // 因为有了全局配置URL,所以上面的并发请求示例就可以简写
    axios.all([
        axios.get('/a'),
        axios.get(/b')]
    ).then(results => console.log(results))  // results封装了两次请求的结果
    

    其余配置信息参考官网: http://www.axios-js.com/zh-cn/docs/

    5.Axios实例

    • 我们在使用axios发送请求时,直接使用axios.get('http://127.0.0.1:8080/index').then()就可以了, 其实这个axios是框架帮我们创建好的default实例. 查看源码

      declare const Axios: AxiosStatic;
      
      export default Axios;
      

      我们使用 import axios from 'axios' 导入的就是这个default Axios实例.

    • 创建Axios实例

      import axios from 'axios'
      //创建Axios实例instance1
      const instance1 = axios.create({
          baseURL: "http://12.23.45.45:8080",
          timeout: 5000
      })
      
      instance1.get("/list").then(resp => console.log(resp));
      
      
      //创建Axios实例instance1
      const instance2 = axios.create({
          baseURL: "http://45.23.55.45:8080",
          timeout: 8000
      })
      instance2.get("/category").then(resp => console.log(resp))
      

    6. 封装request网络请求工具

    • 在项目根目录下创建一个network目录 ,然后在目录里面创建request.js

    6.1 回调的第1种方式

    • 请求工具类request.js, success处理请求成功的逻辑 , failure处理请求失败的逻辑
    /**
     * 因为有可能导出多个axios实例, 所有不使用export default {}
     */
    import axios from 'axios'
    
    export function request1(config,success,failure) {
        // 1. 创建axios的实例
        const instance = axios.create({
            baseURL: "http://123.207.32.32:8000",
            timeout:5000
        })
    
        // 2. 发送真正的网络请求
        instance(config).then(
            res=>success(res)  // 成功回调
        ).catch(
            err=> failure(err)  // 失败回调
        )
    }
    
    • 调用自定义的request工具类

      import {request1} from "./network/request";
      
      request1(
                 {
                      url: '/home/multidata'
                 },
          res => console.log(res),
          err => console.log(err)
      )
      

    6.2 回调的第2种方式

    • request工具类代码 request.js

      import axios from 'axios'
      
      export function request1(config) {
          // 1. 创建axios的实例
          const instance = axios.create({
              baseURL: "http://123.207.32.32:8000",
              timeout:5000
          })
      
          // 2. 发送真正的网络请求
          instance(config.baseConfig).then(
              res=>config.success(res)  // 成功回调
          ).catch(
              err=> config.failure(err)  // 失败回调
          )
      }
      
    • 调用方代码

      import {request1} from "./network/request";
      
      request1({
          baseConfig:{
              url:'/home/multidata'
          },
          success: function (res) {
              console.log(res);
          },
          failure:(err)=> console.log(err)
      })
      
    • 总结: 6.2 只是将6.1的所有入参封装成了一个对象. 其实质还是一样的.

    6.3 回调的第3种方式(Promise)

    • request工具类request.js

      import axios from 'axios'
      export function request1(config) {
          return new Promise(((resolve, reject) => {
              const instance =  axios.create({
                  baseURL: "http://123.207.32.32:8000",
                  timeout:5000
              })
      
              instance(config).then(  // 其实instance就是一个Promise对象,所以才有了第4种回调方式
                  res=> resolve(res)
              ).catch(
                  err=> reject(err)
              )
          }))
      }
      
    • 调用方

      import {request1} from "./network/request";
      
      request1({
          url:'/home/multidata'
      }).then(
          res=> console.log(res)
      ).catch(
          err=> console.log(err)
      )
      

    6.4 回调的第4种方式(推荐)

    • request工具类request.js

      import axios from 'axios'
      export function request1(config) {
          const instance =  axios.create({
         		 baseURL: "http://123.207.32.32:8000",
         		 timeout:5000
          })
      
          return instance(config)
      
      }
      
    • 调用方

      import {request1} from "./network/request";
      
      request1({
          url:'/home/multidata'
      }).then(
          res=> console.log(res)
      ).catch(
          err=> console.log(err)
      )
      

    7.拦截器

    • 在请求或响应被 thencatch 处理前拦截它们

    7.1 请求拦截

    import axios from 'axios'
    
    
    export function request1(config) {
      
            const instance = axios.create({
                baseURL: "http://123.207.32.32:8000",
                timeout: 5000
            })
    
            // 请求拦截
            instance.interceptors.request.use(
                config => {   // 请求成功拦截
                	// 做一些逻辑...
                	// 比如: 请求携带token
                    console.log(config)
                    return config
                },
                err =>{  // 请求失败拦截
               		 console.log(err)
               		 return Promise.reject(err)
                } 
            )
    
            return instance(config)
    
    }
    

    7.2 响应拦截器

    export function request1(config) {
        const instance = axios.create({
            baseURL: "http://123.207.32.32:8000",
            timeout: 5000
        })
       
        // 响应拦截
        instance.interceptors.response.use(
            response => {  // 响应成功
                console.log(response)
                return response.data;  // 响应成功之后,只返回服务器响应的data数据. (对数据进行过滤)
            },
            err => {// 响应失败
                console.log(err)  
                return Promise.reject(err)
            }
        );
        return instance(config)
    
    
    }
    

    7.3 完整示例代码

    • request工具类代码
    import axios from 'axios'
    
    
    export function request1(config) {
        const instance = axios.create({
            baseURL: "http://123.207.32.32:8000",
            timeout: 5000
        })
        // 请求拦截
        instance.interceptors.request.use(
            config => {   // 请求成功拦截
                console.log(config)
                return config
            },
            err => { // 请求失败拦截
                console.log(err)
                return Promise.reject(err)
            }
        )
    
    
        // 响应拦截
        instance.interceptors.response.use(
            response => {  // 响应成功
                console.log(response)
                return response.data;  // 响应成功之后,只返回服务器响应的data数据. (对数据进行过滤)
            },
            err => {// 响应失败
                console.log(err)
                return Promise.reject(err)
            }
        );
        return instance(config)
    
    
    }
    
    
    • 调用方代码
      import {request1} from "./network/request";
      
      request1({
          url:'/home/multidata'
      }).then(
          res=> {
              console.log(res)
          }
      ).catch(
          err=> console.log(err)
      )
    
  • 相关阅读:
    rem 适配屏幕大小
    javascript实现多线程提升项目加载速度
    前端工程化、模块化、组件化见解
    Object.defineProperty方法
    js 冒泡排序
    git 如何生成 SSH 公钥
    奇数幻方
    最长公共子序列-动态规划
    Sping学习笔记_整合hibernate
    Sping学习笔记_AOP
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/13059997.html
Copyright © 2020-2023  润新知