axios的理解和使用

axios(儿个煞斯)是什么?

  1. 前端最流行的ajax请求库
  2. react/vue 官方都推荐使用axios发ajax请求
  3. 文档:http://www.axios-js.com/zh-cn/docs/

axios特点

  1. 基本promise的异步ajax请求库
  2. 浏览器端/node端都可以使用
  3. 支持请求/响应拦截器
  4. 支持请求取消
  5. 请求/响应数据转换
  6. 批量发送多个请求

axios常用语法

axios(config) 通用/最本质的发任意类型请求的方式
axios(url[,config]) 可以只指定url发送get请求
axios.request(config) 等同于axios(config)
axios.get(url[,config]) 发get请求
axios.delete(url[.config]) 发delete请求
axios.post(url[,data,config]) 发post请求
axios.put(url[,data,config]) 发put请求
axios.defaults.xxx 请求的默认全局配置
axios.interceptors.request.use() 添加请求拦截器
axios.interceptors.response.use() 添加响应拦截器
axios.create([config]) 创建一个新的axios(它没有下面的功能)
axios.Cancel() 用于创建取消请求的错误对象
axios.CancelToken() 用于创建取消请求的token对象
axios.isCancel() 是否是一个取消请求的错误
axios.all(promises) 用于批量执行多个异步请求
axios.spread() 用来指定接收所有成功数据的回调函数方法

难点语法的理解和使用

axios.create(config)

  1. 根据指定配置创建一个新的axios, 也就就每个新axios 都有自己的配置
  2. 新axios 只是没有取消请求和批量发请求的方法, 其它所有语法都是一致的
  3. 为什么要设计这个语法?
    (1) 需求: 项目中有部分接口需要的配置与另一部分接口需要的配置不太一
    样, 如何处理
    (2) 解决: 创建2 个新axios, 每个都有自己特有的配置, 分别应用到不同要
    求的接口请求中

拦截器函数/ajax请求/请求的回调函数的调用顺序

  1. 说明: 调用axios()并不是立即发送ajax 请求, 而是需要经历一个较长的流程
  2. 流程: 请求拦截器2 => 请求拦截器1 => 发ajax 请求=> 响应拦截器1 => 响
    应拦截器2 => 请求的回调
  3. 注意: 此流程是通过promise 串连起来的, 请求拦截器传递的是config, 响应
    拦截器传递的是response

取消请求

  1. 基本流程
    配置cancelToken 对象
    缓存用于取消请求的cancel 函数
    在后面特定时机调用cancel 函数取消请求
    在错误回调中判断如果error 是cancel, 做相应处理
  2. 实现功能
    点击按钮, 取消某个正在请求中的请求
    在请求一个接口前, 取消前面一个未完成的请求

axios的使用

发送axios请求

<body>
  
    <div>
      <button onclick="testGet()">GET请求</button>
      <button onclick="testPost()">POST请求</button>
      <button onclick="testPut()">PUT请求</button>
      <button onclick="testDelete()">DELETE请求</button>
    </div>
  
    <script src="https://cdn.bootcss.com/axios/0.19.0/axios.js"></script>
    <script>
      // 指定默认配置
      axios.defaults.baseURL = ‘http://localhost:3000‘

      /* 1. GET请求: 从服务器端获取数据*/
      function testGet() {
        // axios.get(‘/posts?id=1‘)
        axios({
          url: ‘/posts‘,
          params: {
            id: 1
          }
        })
          .then(response => {
            console.log(‘/posts get‘, response.data)
          })
      }
  
      /* 2. POST请求: 向服务器端添加新数据*/
      function testPost() {
        // axios.post(‘/posts‘, {"title": "json-server3", "author": "typicode3"})
        axios({
          url: ‘/posts‘,
          method: ‘post‘,
          data: {"title": "json-server4", "author": "typicode4"}
        })
          .then(response => {
            console.log(‘/posts post‘, response.data)
          })
      }
  
      /* 3. PUT请求: 更新服务器端已经数据 */
      function testPut() {
        // axios.put(‘http://localhost:3000/posts/4‘, {"title": "json-server...", "author": "typicode..."})
        axios({
          url: ‘/posts/4‘,
          method: ‘put‘,
          data: {"title": "json-server5", "author": "typicode5"}
        })
          .then(response => {
            console.log(‘/posts put‘, response.data)
          })
      }
  
      /* 4. DELETE请求: 删除服务器端数据 */
      function testDelete() {
        // axios.delete(‘http://localhost:3000/posts/4‘)
        axios({
          url: ‘/posts/5‘,
          method: ‘delete‘
        })
          .then(response => {
            console.log(‘/posts delete‘, response.data)
          })
      }
  
    </script>
</body>

create方法

需求: 项目中有部分接口需要的配置与另一部分接口需要的配置不太一样, 如何处理
解决: 创建2个新axios, 每个都有自己特有的配置, 分别应用到不同要求的接口请求中

<body>
  <!-- 
  1). axios.create(config)
    a. 根据指定配置创建一个新的axios, 也就就每个新axios都有自己的配置
    b. 新axios只是没有取消请求和批量发请求的方法, 其它所有语法都是一致的
    c. 为什么要设计这个语法?
      需求: 项目中有部分接口需要的配置与另一部分接口需要的配置不太一样, 如何处理
      解决: 创建2个新axios, 每个都有自己特有的配置, 分别应用到不同要求的接口请求中
  -->
  <script src="https://cdn.bootcss.com/axios/0.19.0/axios.js"></script>
  <script>
    axios.defaults.baseURL = ‘http://localhost:3000‘

    // 使用axios发请求
    axios({
      url: ‘/posts‘ // 请求3000
    })

    // axios({
    //   url: ‘/xxx‘ // 请求4000
    // })

    const instance = axios.create({
      baseURL: ‘http://localhost:4000‘
    })

    // 使用instance发请求
    // instance({
    //   url: ‘/xxx‘  // 请求4000
    // })
    instance.get(‘/xxx‘)
  </script>
</body>

axios的处理链流程

// 添加请求拦截器(回调函数)
axios.interceptors.request.use(
  config => {
    console.log(‘request interceptor1 onResolved()‘)
    return config
  },
  error => {
    console.log(‘request interceptor1 onRejected()‘)
    return Promise.reject(error);
  }
)
axios.interceptors.request.use(
  config => {
    console.log(‘request interceptor2 onResolved()‘)
    return config
  },
  error => {
    console.log(‘request interceptor2 onRejected()‘)
    return Promise.reject(error);
  }
)
// 添加响应拦截器
axios.interceptors.response.use(
  response => {
    console.log(‘response interceptor1 onResolved()‘)
    return response
  },
  function (error) {
    console.log(‘response interceptor1 onRejected()‘)
    return Promise.reject(error);
  }
)
axios.interceptors.response.use(
  response => {
    console.log(‘response interceptor2 onResolved()‘)
    return response
  },
  function (error) {
    console.log(‘response interceptor2 onRejected()‘)
    return Promise.reject(error);
  }
)

axios.get(‘http://localhost:3000/posts‘)
  .then(response => {
    console.log(‘data‘, response.data)
  })
  .catch(error => {
    console.log(‘error‘, error.message)
  })

axios的理解和使用

取消请求

<body>
  <button onclick="getProducts1()">获取商品列表1</button><br>
  <button onclick="getProducts2()">获取商品列表2</button><br>
  <button onclick="cancelReq()">取消请求</button><br>

  <script src="https://cdn.bootcss.com/axios/0.19.0/axios.js"></script>
  <script>
    let cancel  // 用于保存取消请求的函数
    function getProducts1() {
      axios({
        url: ‘http://localhost:4000/products1‘,
        cancelToken: new axios.CancelToken((c) => { // c是用于取消当前请求的函数
          // 保存取消函数, 用于之后可能需要取消当前请求
          cancel = c
        })
      }).then(
        response => {
          cancel = null
          console.log(‘请求1成功了‘, response.data)
        },
        error => {
          cancel = null
          console.log(‘请求1失败了‘, error.message, error)
        }
      )
    }

    function getProducts2() {
      axios({
        url: ‘http://localhost:4000/products2‘
      }).then(
        response => {
          console.log(‘请求2成功了‘, response.data)
        },
        error => {
          cancel = null
          console.log(‘请求2失败了‘, error.message)
        }
      )
    }

    function cancelReq() {
      // alert(‘取消请求‘)
      // 执行取消请求的函数
      if (typeof cancel === ‘function‘) {
        cancel(‘强制取消请求‘)
      } else {
        console.log(‘没有可取消的请求‘)
      }
    }
  </script>
</body>

axios的理解和使用

上一篇:vue-中的-axios分装


下一篇:axios入门(二)