详细介绍axios(配置axios发送请求拦截器取消请求)和axios的源码分析

Posted 一乐乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详细介绍axios(配置axios发送请求拦截器取消请求)和axios的源码分析相关的知识,希望对你有一定的参考价值。


✿ axios的github地址(更多细节可以参考github):https://github.com/axios/axios



一、axios的配置介绍(重点属性:url、baseURL、params、headers、 data、timeout、proxy

1、常用的默认配置的是:baseURL、method、timeout

(1)baseURL设置url的基本结构(请求根地址),域名和协议,再结合属性url某个请求路径,axios会自动将baseURL 和 url 进行拼接,从而得出正确的请求路径。
(2)method:请求方式 get/post
(3) timeout:延时时间(超过多少时间就取消请求)【单位是毫秒


2、介绍其他配置属性:

(1)params: 请求参数(查询的对象)
(2)transformRequest、transformResponse 对请求结果进行预处理、对响应结果进行预处理
(3)headers:请求头 (在身份验证时,可以在头信息加入一个标识)
(4)data:请求体(数据形式有json对象和字符串形式)
(5)responseType:响应的数据格式 json/text/document/stream等
(6)withCredentials:跨域亲戚是否携带cookies
(7)auth:请求基础验证(验证用户名和密码)
(8)adapter:自定义请求处理
(9)xsrfCookieName和xsrfHeaderName 设置cookie的名字,设置头信息名字(安全设置,保证请求来自自己的客户端,避免跨站(域)攻击【标识保护作用---标识:返回请求的返回结果带有服务端的sessionID,保护:某些网站会通过超链接向在哪服务器发送请求,由于没有拿到服务器的sessionID,请求失败】)
(10)socketPath:设置socket文件位置,向docker的守护进行发送请求,与代理proxy有优先级关系,两者同时设定,优先选socket
(11)httpAgent、httpsAgent 设置客户端信息
(12)proxy 代理:axios的代理是在服务端node.js 中【代理作用:抓取数据(爬虫),
使用一个ip向某个目标服务器发送请求以抓取数据时,可能会被禁掉ip------解决:借助多个中间代理进行切换,发送请求从而获取到目标服务器的数据。
(13)cancelToken:取消请求



二、axios的使用:

✿ 使用axios前必知细节:

1、axios“函数对象”(可以用作函数使用,也可以用作对象使用【通过源码发现其使用了方法bind和方法utils.extend实现的(文章最后有axios的源码分析)】)
所以看到 axios作为函数对象,可以获取属性,例如 axios.defaults.baseURL 也可以获取方法,例如 axios.get(url[, config])

2、[, ] 是可选参数列表 举例:axios.get(url[, config]),其中的[, config] 是可选参数



1、axios作为方法,axios()方法传入一个对象参数(带有method、url等属性):

■ 举例:

<button class="btn btn-primary">Get请求</button>

//获取按钮
const btns = document.querySelectorAll(\'button\');
btns[0].onclick = function ()
    //调用axios方法(返回值是一个Promise对象),发送AJAx请求
    axios(
        //请求类型
        method: \'GET\',
        //URL
        url:\'http://localhost:3000/posts/2\'
    ).then(response => 
        console.log(response)
    )
;

2、axios作为对象,调用其方法request(config)、post(url[, config])等

■ 举例:

<button class="btn btn-primary">Get请求</button>

//获取按钮
const btns = document.querySelectorAll(\'button\');
btns[0].onclick = function ()
    //调用axios对象调用request方法(方法中传入一个对象参数)
    axios.request(
        //请求类型
        method: \'GET\',
        //URL
        url:\'http://localhost:3000/posts/2\'
    ).then(response => 
        console.log(response)
    )
;

□ 第二种和第一种差不多啦


3、使用axios的实例对象(通过axios.create([config]) 进行创建)

//一般创建axios实例时,传入一些默认配置
const instance = axios.create(
baseURL: \'https://some-domain.com/api/\',
    timeout: 1000,
    headers: \'X-Custom-Header\': \'foobar\'
);
//instance 实例和 axios对象功能基本差不多
//使用axios的实例对象
instance(
    url: \'/getJoke\'
).then(response => 
    console.log(response);
)



✿ 使用axios() 方法 和创建 axios实例对象的区别?

axios.create(config) 对axios请求进行封装,创建axios实例对象的意义:不同请求接口可以拥有不同配置:例如服务器A提供了一个请求接口a,服务器B提供了一个请求接口b,这时候针对具体请求接口而创建axios实例,就可以拥有该请求接口的配置(默认配置+常用配置)。



三、axios的拦截器(对请求、响应做预处理)

1、请求拦截器:axios.interceptors.request.use(成功处理函数,失败处理函数)

■ 请求拦截:

1,可能是config中有一些信息是不符合服务器的要求

2,希望每次发送网络请求,在界面可以显示有一个请求的图标,就是那个转呀转的圆圈

3,一些网络请求必须要有特殊信息,例如登录(需要有token)

2、响应拦截器:axios.interceptors.response.use(成功处理函数,失败处理函数)

■ 响应拦截:

1,对响应的数据进行格式处理



四、axios的取消请求

■ 作用:取消掉某些用户,多次不断地点击请求按钮而发送请求给服务器造成压力

■ 取消方式:
例如通过构造函数来创建取消令牌:在配置对象中添加 cancelToken属性,然后拿到执行函数中的参数c取消函数

let cancel = null;
//检测上一次请求是否完成(没完成,取消当前的请求)
if(cancle != null)
    cancle();

//axios发送请求
axios.get(\'/user/12345\', 
    cancelToken: new axios.CancelToken(function executor(c)//参数c是取消函数        	cancel = c;
    )
).then(response => 
    console.log(response);
    cancel = null; //请求执行完毕,恢复cancel的初始值

);



五、axios的源码分析:

1、查看axios的实例对象new Axios(defaultConfig);

① 在类Axios 发现有配置对象拦截器对象属性
② 在Axios.js 文件中,还发现Axios的原型:Axios.prototype动态添加了属性方法

request,getUri,

\'delete\', \'get\', \'head\', \'options\',

\'post\', \'put\', \'patch\'

// 通过配置创建 axios 函数
var axios = createInstance(defaults);

function createInstance(defaultConfig) 
    //创建一个实例对象 context 可以调用 get  post put delete request
    var context = new Axios(defaultConfig);// context 不能当函数使用 
	……


//=============== 在 Axios 类内有属性 配置对象和拦截器对象 =============
function Axios(instanceConfig) 
    //实例对象上的 defaults 属性为配置对象
    this.defaults = instanceConfig;
    //实例对象上有 interceptors 属性用来设置请求和响应拦截器
    this.interceptors = 
        request: new InterceptorManager(),
        response: new InterceptorManager()
    ;


//================== 在Axios.js 文件中,还发现:======================
Axios.prototype.request = function request(config) 
	……

Axios.prototype.getUri = function getUri(config) 
	……

utils.forEach([\'delete\', \'get\', \'head\', \'options\'], function forEachMethodNoData(method) 
    Axios.prototype[method] = function (url, config) 
	……
   

utils.forEach([\'post\', \'put\', \'patch\'], function forEachMethodWithData(method) 
    Axios.prototype[method] = function (url, data, config) 
	……
   


2、接着是instance:

首先是通过方法bind将request方法赋值给instance(此时instance是一个函数变量);
然后,通过方法extends 将Axios.prototype 上的方法添加到 instance身上(此时instance是一个
“函数对象”变量
);还将实例对象content的属性(配置对象拦截器对象属性)添加到instance身上

function createInstance(defaultConfig) 
//创建Axios的实例对象 context
    var context = new Axios(defaultConfig);//context 是实例对象,不能当函数使用
//将request 方法的 this 指向 context 并返回新函数 (instance 与 Axios.prototype.request 代码一致)
    var instance = bind(Axios.prototype.request, context); //instance是函数,可以用作函数使用
//将Axios的原型 Axios.prototype 的方法都添加到 instance 函数身上
    utils.extend(instance, Axios.prototype, context); //instance是"函数对象",可当函数使用,也可当对象使用
//将实例对象content的方法和属性添加到 instance 函数身上
  utils.extend(instance, context);

  return instance;


■ bind函数:

//返回一个新的函数,并将新函数 this 绑定到一个对象身上
module.exports = function bind(fn, thisArg) 
    return function wrap() 
        var args = new Array(arguments.length);
        for (var i = 0; i < args.length; i++) 
            args[i] = arguments[i];
        
        return fn.apply(thisArg, args);
    ;
;

■ extend函数:

function extend(a, b, thisArg) 
    forEach(b, function assignValue(val, key) 
        if (thisArg && typeof val === \'function\') 
            a[key] = bind(val, thisArg);
         else 
            a[key] = val;
        
    );
    return a;

以上是关于详细介绍axios(配置axios发送请求拦截器取消请求)和axios的源码分析的主要内容,如果未能解决你的问题,请参考以下文章

axios:基本使用常用配置项create方法请求和响应拦截器取消请求

Vue 使用axios发送请求

Axios拦截器配置

axios中的请求拦截器怎么用

Axios 前后端交互工具学习

Axios 前后端交互工具学习