【axios】axios入门与源码分析

本文详细介绍了axios的使用,包括json-Server服务搭建、axios基本使用、请求响应结果结构等,并深入源码分析,探讨axios创建过程、发送请求、拦截器及取消请求的工作原理。
摘要由CSDN通过智能技术生成

目录

一.axios使用

1.json-Server服务搭建

2.axios的介绍与页面配置

3.axios的基本使用

4.axios其他方式发送请求

5.axios请求响应结果的结构

6.axios配置对象详细说明

7.axios的默认配置

8.axios创建实例发送请求

9.axios拦截器

10.axios取消请求

二.axios源码分析 

11.axios文件结构说明

12.axios的创建过程详解

13.模拟实现axios对象的创建过程

14.axios发送请求过程详解

15.模拟实现axios发送请求

16.axios拦截器工作原理

17.模拟实现axios拦截器功能

18.axios取消请求工作原理

19.模拟实现axios取消请求功能

20.axios源码分析总结


一.axios使用

1.json-Server服务搭建

json-Server可以快速搭建http服务,首先用命令行安装

npm install -g json-server

然后创建一个db.json文件

{
  "posts": [
    {
      "id": 1,
      "title": "json-server",
      "author": "typicode"
    },
    {
      "id": 2,
      "title": "尚硅谷大厂学院上线啦",
      "author": "小编"
    }
  ],
  "comments": [
    {
      "id": 1,
      "body": "some comment",
      "postId": 1
    },
    {
      "body": "喜大普奔",
      "postId": 2,
      "id": 2
    }
  ],
  "profile": {
    "name": "typicode"
  }
}

最后在db.json文件所在文件夹目录下启动服务

json-server --watch db.json

2.axios的介绍与页面配置

2.1. axios 是什么 ?
1. 前端最流行的 ajax 请求库
2. react/vue 官方都推荐使用 axios ajax 请求

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

2.3. axios 安装
1. npm install axios
2. bower install axios
3. yarn install axios

 这里使用CND的方式直接引入: <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>axios配置</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
</head>
<body>
    <script>
        console.log(axios);
    </script>
</body>
</html>

3.axios的基本使用

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>axios基本使用</title>
    <link crossorigin="anonymous" href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
</head>
<body>
    <div class="container">
        <h2 class="page-header">基本使用</h2>
        <button class="btn btn-primary"> 发送GET请求 </button>
        <button class="btn btn-warning" > 发送POST请求 </button>
        <button class="btn btn-success"> 发送 PUT 请求 </button>
        <button class="btn btn-danger"> 发送 DELETE 请求 </button>
    </div>
    <script>
        //获取按钮
        const btns = document.querySelectorAll('button');

        //第一个
        btns[0].onclick = function(){
            //发送 AJAX 请求
            axios({
                //请求类型
                method: 'GET',
                //URL
                url: 'http://localhost:3000/posts/2',
            }).then(response => {
                console.log(response);
            });
        }

        //添加一篇新的文章
        btns[1].onclick = function(){
            //发送 AJAX 请求
            axios({
                //请求类型
                method: 'POST',
                //URL
                url: 'http://localhost:3000/posts',
                //设置请求体
                data: {
                    title: "今天天气不错, 还挺风和日丽的",
                    author: "张三"
                }
            }).then(response => {
                console.log(response);
            });
        }

        //更新数据
        btns[2].onclick = function(){
            //发送 AJAX 请求
            axios({
                //请求类型
                method: 'PUT',
                //URL
                url: 'http://localhost:3000/posts/3',
                //设置请求体
                data: {
                    title: "今天天气不错, 还挺风和日丽的",
                    author: "李四"
                }
            }).then(response => {
                console.log(response);
            });
        }

        //删除数据
        btns[3].onclick = function(){
            //发送 AJAX 请求
            axios({
                //请求类型
                method: 'delete',
                //URL
                url: 'http://localhost:3000/posts/3',
            }).then(response => {
                console.log(response);
            });
        }

    </script>
</body>

</html>

4.axios其他方式发送请求

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(): 用来指定接收所有成功数据的回调函数的方法

 

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>axios其他使用</title>
    <link crossorigin="anonymous" href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
</head>
<body>
    <div class="container">
        <h2 class="page-header">其他使用</h2>
        <button class="btn btn-primary"> 发送GET请求 </button>
        <button class="btn btn-warning" > 发送POST请求 </button>
        <button class="btn btn-success"> 发送 PUT 请求 </button>
        <button class="btn btn-danger"> 发送 DELETE 请求 </button>
    </div>
    <script>
        //获取按钮
        const btns = document.querySelectorAll('button');

        //发送 GET 请求
        btns[0].onclick = function(){
            // axios()
            axios.request({
                method:'GET',
                url: 'http://localhost:3000/comments'
            }).then(response => {
                console.log(response);
            })
        }

        //发送 POST 请求
        btns[1].onclick = function(){
            // axios()
            axios.post(
                'http://localhost:3000/comments', 
                {
                    "body": "喜大普奔",
                    "postId": 2
                }).then(response => {
                    console.log(response);
                })
        }

   

    </script>
</body>

</html>

5.axios请求响应结果的结构

 

config:配置对象,里面包含请求类型、请求URL、请求体等

data:响应体的结果

headers:响应头信息

request:原生的Ajax请求对象

status:响应状态码

statusText:响应状态字符串 

6.axios配置对象详细说明

这些是用于发出请求的可用配置选项。只有url是必需的。GET如果method未指定,请求将默认为。 

{ 
  // `url` 是将用于请求url的服务器 
  URL : '/user' ,

  // `method` 是发出请求时要使用的请求方法 
  method : 'get' ,  // 默认

  // `baseURL` 将被添加到 `url` 之前,除非 `url` 是绝对的。
  // 为 axios 实例设置 `baseURL` 以将相对 URL 
  // 传递给该实例的方法会很方便。
  baseURL : 'https://some-domain.com/api/' ,

  // `transformRequest` 允许在将请求数据发送到服务器之前对其进行更改
  // 这仅适用于请求方法 'PUT'、'POST'、'PATCH' 和 'DELETE' 
  // 数组中的最后一个函数必须返回字符串或 Buffer、ArrayBuffer 的实例,
  // FormData 或 Stream 
  // 您可以修改 headers 对象。
  transformRequest : [ function  ( data ,  headers )  { 
    // 做任何你想做的转换数据

        return data;

  } ] ,

  // `transformResponse` 允许在将响应数据传递给 then/catch之前更改响应数据
  transformResponse : [ function  ( data )  { 
    // 做任何你想做的事情来转换数据

        return data;

  } ] ,

  // `headers` 是要发送的自定义头
  headers : { 'X-Requested-With' : 'XMLHttpRequest' } ,

  // `params` 是与请求一起发送的 URL 参数
  // 必须是普通对象或 URLSearchParams 对象
  params : { 
    ID : 12345 
  } ,

  // `paramsSerializer` 是一个可选函数,负责序列化 `params` 
  // (eg https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/) 
   paramsSerializer: function (params) {
    return Qs.stringify(params, {arrayFormat: 'brackets'})
  },

  // `data` 是要作为请求体发送的数据
  // 仅适用于请求方法 'PUT'、'POST'、'DELETE 和 'PATCH' 
  // 当没有设置 `transformRequest` 时,必须是以下类型之一:
  // - 字符串、普通对象、ArrayBuffer、ArrayBufferView、URLSearchParams 
  // - 仅限浏览器:FormData、File、Blob 
  // - 仅限节点:流、缓冲区
  data:{ 
    firstName : 'Fred' 
  } ,
  
  // 将数据发送到正文的替代语法
  // 方法 post 
  // 仅发送值,而不发送键
  data:'Country=Brasil&City=Belo Horizo​​nte' ,

  // `timeout` 指定请求超时前的毫秒数。
  // 如果请求时间超过 `timeout`,请求将被中止。
  timeout : 1000 ,  // 默认为 `0`(无超时)

  // `withCredentials` 指示是否应该使用凭据进行跨站点访问控制请求 
  withCredentials : false ,  // 默认

  // `adapter` 允许自定义处理请求,这使得测试更容易。
  // 返回一个承诺并提供一个有效的响应(参见 lib/adapters/README.md)。
   adapter: function (config) {
    /* ... */
  },

  // `auth` 表示应该使用 HTTP 基本身份验证,并提供凭据。
  // 这将设置一个 `Authorization` 标头,覆盖您使用 `headers` 设置的任何现有的 
  // `Authorization` 自定义标头。
  // 请注意,通过此参数只能配置 HTTP Basic auth。
  // 对于 Bearer 令牌等,请改用 `Authorization` 自定义标头。
 auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },

  // `responseType` 表示服务器将响应的数据类型
  // 选项有:'arraybuffer'、'document'、'json'、'text'、'stream' 
  // 仅限浏览器:'blob' 
  responseType : 'json' ,  // 默认

  // `responseEncoding` 表示用于解码响应的编码(仅限 Node.js)
  // 注意:忽略 `responseType` 的 'stream' 或客户端请求
  responseEncoding : 'utf8' ,  // 默认

  // `xsrfCookieName` 是用作 xsrf 令牌值的 cookie 的名称
  xsrfCookieName : 'XSRF-TOKEN' ,  // 默认

  // `xsrfHeaderName` 是带有 xsrf 令牌值的 http 头的名称
  xsrfHeaderName : 'X-XSRF-TOKEN' ,  // 默认

  // `onUploadProgress` 允许处理上传的进度事件
  // 仅浏览器
  onUploadProgress : function  ( progressEvent )  { 
    // 对本地进度事件做任何你想做的事情
  } ,

  // `onDownloadProgress` 允许处理下载的进度事件
  // 仅浏览器
  onDownloadProgress : function  ( progressEvent )  { 
    // 对本地进度事件做任何你想做的事情
  } ,

  // `maxContentLength` 定义了 node.js 中允许的 http 响应内容的最大大小
  maxContentLength : 2000 ,

  // `maxBodyLength`(仅限节点选项)定义允许的 http 请求内容的最大大小(以字节为单位) 
  maxBodyLength : 2000 ,

  // `validateStatus` 定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值