webRequest API:如何获取新请求的requestId?

问题描述 投票:0回答:2

chrome.webRequest API 具有请求 ID 的概念(来源:Chrome webRequest 文档):

请求ID

每个请求都由请求 ID 来标识。该 ID 在浏览器会话和扩展程序上下文中是唯一的。它在请求的生命周期中保持不变,可用于匹配同一请求的事件。请注意,在 HTTP 重定向或 HTTP 身份验证的情况下,多个 HTTP 请求会映射到一个 Web 请求。

您甚至可以使用它来关联请求,甚至跨重定向。但是,当使用

fetch
XMLHttpRequest
启动新请求时,如何最初获取 id?

到目前为止,我还没有找到比使用请求的 URL 更好的方法来在新请求和 requestId 之间建立初始链接。但是,如果对同一资源存在重叠请求,则这是不可靠的。

问题:

  • 如果您发出新请求(使用
    fetch
    XMLHttpRequest
    ),如何可靠地访问 requestId?
  • fetch API 或 XMLHttpRequest API 是否允许访问 requestId?

我想做的是使用 webRequest API 提供的功能来修改单个请求,但我想确保我不会意外修改其他待处理的请求。

javascript google-chrome-extension xmlhttprequest fetch-api firefox-addon-webextensions
2个回答
0
投票

据我所知,

fetch
XHMLHttpRequest
API 没有直接支持。另外我不知道完全可靠的方法来获取 requestId。

我最终做的是安装一个 onBeforeRequest 侦听器,存储 requestId,然后立即再次删除侦听器。例如,它可能看起来像这样:

function makeSomeRequest(url) {

  let listener;
  const removeListener = () => {
    if (listener) {
      chrome.webRequest.onBeforeRequest.removeListener(listener);
      listener = null;
    }
  };

  let requestId;
  listener = (details) => {
    if (!requestId && urlMatches(details.url, url)) {
      requestId = details.requestId;
      removeListener();
    }
  };
  chrome.webRequest.onBeforeRequest.addListener(listener, { urls: ['<all_urls>'] });

  // install other listeners, which can then use the stored "requestId"
  // ...

  // finally, start the actual request, for instance
  const promise = fetch(url).then(doSomething);

  // and make sure to always clean up the listener
  promise.then(removeListener, removeLister);
}

它并不完美,匹配 URL 是我未解决的细节。您可以简单地比较

details.url
是否与
url
相同:

function urlMatches(url1, url2) {
  return url1 === url2;
}

请注意,不能保证您看到相同的 URL,例如,如果针对

http://some.domain.test
发出请求,您将在侦听器中看到
http://some.domain.test/
(有关详细信息,请参阅我的 其他问题)。或者
http://
可以替换为
https://
(这里我不确定,但这可能是因为其他扩展,如 HTTPS Everywhere)。

这就是为什么上面的代码只能被视为想法的草图。只要您不向同一 URL 发起多个请求,它在实践中似乎就足够好了。尽管如此,我还是有兴趣了解解决该问题的更好方法。


0
投票

哈罗先生,我对工作感兴趣,先生,我是我的工作工作电工工作工作经验10 ayr先生我是我巴基斯坦卡拉奇我的地址fs45/4 Fshout Jinnah isqar malir卡拉奇巴基斯坦邮政编码nambar 75080我的名字mumohmad Ismail我的联系电话watsub 03162238028 先生,我的要求请帮助我工作

© www.soinside.com 2019 - 2024. All rights reserved.