覆盖 post 个请求

Override post requests

我在控制台中输入了以下代码:

XMLHttpRequest.prototype.send = function(body) {
    // modifies inputted request
    newBody = JSON.parse(body);
    newBody.points = 417;

  // sends modified request
    this.realSend(JSON.stringify(newBody));
}

按理说每次发请求都是417积分,但是我看请求体,还是说原来的积分数。有帮助吗?

尝试在修改后的 XMLHttpRequest.prototype.send 中添加 alert()console.log() 以检查它是否真的有效。有一种方法可以悄悄地防止这种修改。

正如其他人所指出的,如果不了解您是如何创建的 this.realSend

,则很难准确诊断您遇到的错误

但是,此代码将起作用:

const send = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function (body) {
    const newBody = JSON.parse(body);
    newBody.points = 417;
    send.call(this, JSON.stringify(newBody));
};

请注意,我没有将原始 send 方法存储在 XMLHttpRequest.prototype 上,而是保存在一个单独的变量中,并通过 [=15] 使用正确的 this 值简单地调用它=].这似乎是一个更简洁的实现,与其他代码发生冲突的可能性更小。

有关工作示例,请参阅 this codesandbox

如果您的函数未被调用,可能 fetch 用于发出 ajax 请求。

所以你可以像这样包装两个函数

const send = XMLHttpRequest.prototype.send;
const _fetch = window.fetch;

XMLHttpRequest.prototype.send = function (body) {
   const newBody = JSON.parse(body);
   newBody.points = 417;
   send.call(this, JSON.stringify(newBody));
};

window.fetch = function(url, options){
   let newBody;
   if(options.body) {
      newBody = JSON.parse(options.body);
      newBody.points = 417;
      options.body = JSON.stringify(newBody);
   }
   _fetch.call(this, url, options);
}