宣布一个npm包,用于监控页面中的一切API要求的状况和效果

  在前端监控体系中,或许其他场景下,假如我们须要监控当前页面下一切要求状况。能够一般要求下,我们会挑选在要求的回调中去处置惩罚。这类做法的瑕玷就是会侵入详细的营业代码。在一般的监控中,监控部份的代码和营业部份的代码是星散的。另外,假如存在许多的要求须要被监听,经由历程侵入详细营业代码,为了削减代码的反复,也须要封装监听要求的逻辑。

  本文经由历程monkey patches的要领完成了一个request-interceptor包,能够按需求监听要求。

  该npm包的项目地点为:https://github.com/forthealll… 迎接运用。

  • 猎取API要求的状况和效果
  • monkey patches完成监控XMLHttpRequest要求
  • monkey patches完成监控fetch要求

本文的原文在我的博客中:https://github.com/forthealll…

迎接star

一、猎取API要乞降效果

  猎取要求的体式格局包含了fetch和XMLHttpRequest。比方下面是一个XMLHttpRequest要求的例子:

var client = new XMLHttpRequest();
client.open("POST","http://10.12.72.16:8080/extraInfo" );
client.setRequestHeader("Content-Type", "application/json; charset=utf-8");
client.send(JSON.stringify({}));

  一般我们会经由历程client上动身的readystatechange来推断要求的状况以及获得要求的相应效果:

client.onreadystatechange = function () {
if (client .readyState==4 &&client.status==200) {
    console.log(client.responseText);//
  }
}

  XMLHttpRequest的prototype除了onreadystatechange事宜外另有其他许多事宜,比方onabout、onerror、onload、onloadstart等等事宜。假如我们要完全的监听一个要求,那末须要完成完全的完成这些事宜:

client.onabout = function(){}
client.onerror = function(){}
clinet.onload = function(){}
client.onloadstart = function(){}
 ....

  另外假如当某一个事宜发作时,须要按递次的执行一系列的函数,如许会使得事宜函数内部愈来愈庞杂,使得团体项目变的没法保护。

fetch要求也是同理,因而我们须要合理的封装监听要求的逻辑。

二、monkey patches完成监控XMLHttpRequest要求

本文不会详细引见怎样经由历程monkey patches来封装监听要求的逻辑,该逻辑已经在我的npm包中完成,详细能够参考我的开源项目:

https://github.com/forthealll…

本文只引见怎样运用,若有兴致,能够读一读详细怎样完成这个monkey patches,在目次的source文件夹中,若有疑问,能够提issue。

该npm包的包名为:req-interceptor。起首来看关于XMLHttpRequest要求怎样运用:

import { ajaxIntercept } from 'req-interceptor';

//监听
const unregister = ajaxIntercept.register({
  requestAbout: function (xhr) {
      // xhr is real instance of a request
      console.log(xhr)
  },
  requestError: function (xhr) {
      // xhr is real instance of a request
      console.log(xhr)
  },
  requestLoad: function (xhr) {
      // xhr is real instance of a request
      console.log(xhr)
  },
});

//发送要求

var client = new XMLHttpRequest();
client.open("POST","http://10.12.72.16:8080/extraInfo" );
client.setRequestHeader("Content-Type", "application/json; charset=utf-8");
client.send(JSON.stringify({}));

只须要在发送要求前先挪用ajaxIntercept.register函数传入监听的对象,该函数会返回一个作废监听的要领。

如许就监听以后的恣意要求,在ajaxIntercept.register中的现实参数的对象中,对象的属性是一个函数,参数为xhr,xhr就是一个被监听的XMLHttpRquest,因而我们能够从xhr中拿到要求的详细相应。xhr的一个例子为:

xhr = {
          readyState: 4
          response: "{"success":0}"
          responseText: "{"success":0}"
          responseType: ""
          responseURL: "http://10.12.72.16:8080/extraInfo"
          responseXML: null
          status: 201
          statusText: "Created"
          timeout: 0
     }

假如我们在作废关于某一个要求的监听,则挪用该返回的
unregister函数,今后要求不会再被监听。

unregister();

另外我们也能够在某一个要求前增加多个监听函数:

import { ajaxIntercept } from 'req-interceptor';
//监听
const unregister1 = ajaxIntercept.register({...});
const unregister2 = ajaxIntercept.register({...});
const unregister3 = ajaxIntercept.register({...});
//要求
client.open(url,....)

假如我们想要一次性移除一切的关于要求的监听函数,能够直接挪用:

ajaxIntercept.clear();

三、monkey patches完成监控fetch要求

关于fetch要求也是一样的。

import { fetchIntercept } from 'req-interceptor';


import { fetchIntercept } from 'req-interceptor';

const unregister = fetchIntercept.register({
    request: function (url, config) {
        // Modify the url or config here
        return [url, config];
    },

    requestError: function (error) {
        // Called when an error occured during another 'request' interceptor call
        return Promise.reject(error);
    },

    response: function (response) {
        // Modify the reponse object
        return response;
    },

    responseError: function (error) {
        // Handle an fetch error
        return Promise.reject(error);
    }
});

// Call fetch to see your interceptors in action.
fetch('http://google.com');

差别的是,fetch不像XMLHttpRequest要求那样,能够监听完全的历程,fetch只要request、requestError、response和responseError这4个属性能够监听,离别映照要求的参数,要求失利,要求返回胜利,要求返回失利。

一样的也能够经由历程返回函数来作废监听,以及经由历程clear函数来作废一切监听函数。

    原文作者:yuxiaoliang
    原文地址: https://segmentfault.com/a/1190000017957055
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞