javascript - 使用 JavaScript,是否可以从传出的获取请求中捕获正文有效负载?

标签 javascript request fetch

所以我想向现有的网站添加一些功能,这是为了让我的生活更轻松。我需要但我似乎无法弄清楚的事情之一是:如何捕获特定的传出“POST”请求的正文有效负载数据。我之前找到了执行此操作的代码,但没有保存,并且我已经搜索了该代码 2 天,但没有结果。

这里是网站向服务器发出请求的示例。

fetch("https://my.site/api/req", {"credentials":"include","headers":{"accept":"*/*","content-type":"application/json"},"referrerPolicy":"no-referrer-when-downgrade","body":"{\"symbol\":\"mySYM\",\"results\":[{\"data\":{\"id\":\"dataID\"},\"result\":\"signature\"}]}","method":"POST","mode":"cors"});

我需要捕获的部分是“body”部分,然后将其取消转义,使其看起来像这样。

{"symbol":"mySYM","results":[{"data":{"id":"dataID"},"result":"signature"}]}

另外,如果可能的话,我希望它只在 method = POST 时捕获数据并请求转到特定的 URL,因此它将捕获/api/req/而不会注意其他 URL 和/或当方法是 = GET, HEAD。

目前,我使用开发工具手动从请求中获取数据,然后单击正确的请求,然后向下滚动以查找 POST 数据。

如果您需要知道原因。服务器通过 websocket 连接对数据进行签名,我本质上是试图捕获该签名以便能够重播它。我不想捕获 websocket 数据,因为它不完整,无法满足我的需求,我需要捕获整个传出请求正文数据。

提前致谢。

最佳答案

选择的解决方案:

感谢@thirtydot 的回复。请注意,我的具体情况仅涉及获取请求,因此这就是我采用此路线的原因。有了你的回应,我自己的研究,以及这个post的帮助我想出了这个解决方案。因为我不太关心看到回复(我有其他功能来处理对我来说很重要的回复)。

const constantMock = window.fetch;
 window.fetch = function() {
    if (arguments[0] === '/api/req' && arguments[1].method === 'post'){
        bodyResults(arguments[1].body)
    }
    return constantMock.apply(this, arguments)
 }


function bodyResults(reqBody){
    console.log(reqBody)
}

将以下内容放入控制台(完全按照我想要的那样)。

{"symbol":"NEON","results":[{"data":{"expires_at":"1561273300","id":"2469c8dd"},"signature":"6d712b9fbb22469c8dd240be13a2c261c7af0dfbe3328469eeadbf6cda00475c"}]}

但现在我可以通过该函数返回这些数据,并继续完全自动化地运行脚本的其余部分。

额外解决方案:

如果其他人遇到类似的问题并关心捕获这些获取请求的响应,我可以选择使用:

const constMock = window.fetch;
window.fetch = function() {
    if (arguments[0] === '/api/req' && arguments[1].method === 'post'){
        bodyResults(arguments[1].body)
    }

    return new Promise((resolve, reject) => {
        constantMock.apply(this, arguments)
            .then((response) => {
                if(response.url.indexOf("/me") > -1 && response.type != "cors"){
                    console.log(response);
                    // do something for specificconditions
                }
                resolve(response);
            })
            .catch((error) => {
                reject(response);
            })
    });
}

function bodyResults(reqBody){
    console.log(reqBody)
}

可能的 XHR 解决方案

注意:这个未经测试! XHR 请求的替代解决方案可以使用类似的方法来完成:

(function(open) {
  XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
    alert('Intercept');
    open.call(this, method, url+".ua", async, user, pass);
  };
})(XMLHttpRequest.prototype.open);

希望这有帮助!

关于javascript - 使用 JavaScript,是否可以从传出的获取请求中捕获正文有效负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56715755/

相关文章:

react-redux - axios 与 fetch - 进行 api 调用时

javascript - 在状态更新期间避免组件内部的刷新功能

javascript - 如何将函数中的值传递到另一个文件中的另一个组件

php - 我可以结合元数据还是必须只使用一个元数据?

Javascript for循环写入未定义的数组

multithreading - Haskell - 基于 Actor 的可变性

javascript - 如何在 Node/Cheerio 中修复 '$(...).click is not a function'

javascript - array.push 后数组元素未定义

video - 如何编写一个从网页下载所有视频并根据创建日期对它们进行排序的程序?

google-chrome - 跨源请求到 Chrome 上的 S3 中缺少源头