Javascript WebRequestAPI:如何获取新请求的requestId?

Javascript WebRequestAPI:如何获取新请求的requestId?,javascript,google-chrome-extension,xmlhttprequest,fetch-api,firefox-addon-webextensions,Javascript,Google Chrome Extension,Xmlhttprequest,Fetch Api,Firefox Addon Webextensions,chrome.webRequest API具有请求ID的概念(来源:): 请求ID 每个请求都由请求ID标识。该ID在浏览器会话和扩展上下文中是唯一的。它在请求的生命周期中保持不变,并可用于匹配同一请求的事件。请注意,在HTTP重定向或HTTP身份验证的情况下,多个HTTP请求映射到一个web请求 您可以使用它来关联请求,甚至跨重定向。但是,当您使用fetch或XMLHttpRequest启动新请求时,最初是如何阻止id的 到目前为止,我还没有找到比使用请求的URL作为在新请求和请求ID之间建立

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

请求ID

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

您可以使用它来关联请求,甚至跨重定向。但是,当您使用
fetch
XMLHttpRequest
启动新请求时,最初是如何阻止id的

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

问题:

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

我想做的是使用WebRequestAPI提供的功能修改单个请求,但我想确保不会意外修改其他挂起的请求。

据我所知,
fetch
XHMLHttpRequest
API中没有直接支持。另外,我还不知道获得requestId的完全可靠的方法

我最后做的是安装一个监听器,存储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);
}
注意,例如,如果针对
http://some.domain.test
,您将看到
http://some.domain.test/
在您的侦听器中(有关详细信息,请参阅my)。或者
http://
可能已经被
https://
所取代(这里我不确定,但可能是因为其他扩展,例如)


这就是为什么上面的代码只应被视为想法的草图。在实践中,只要不启动对同一URL的多个请求,它似乎已经足够好了。尽管如此,我还是有兴趣学习更好的方法来解决这个问题。

据我所知,在
fetch
XHMLHttpRequest
API中没有直接的支持。另外,我还不知道获得requestId的完全可靠的方法

我最后做的是安装一个监听器,存储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);
}
注意,例如,如果针对
http://some.domain.test
,您将看到
http://some.domain.test/
在您的侦听器中(有关详细信息,请参阅my)。或者
http://
可能已经被
https://
所取代(这里我不确定,但可能是因为其他扩展,例如)


这就是为什么上面的代码只应被视为想法的草图。在实践中,只要不启动对同一URL的多个请求,它似乎已经足够好了。尽管如此,我仍有兴趣了解解决问题的更好方法。

在文档传递到callback@PatrickEvans我可以安装onBeforeRequest侦听器并从中获取请求id,然后立即删除侦听器。尽管如此,它仍将被延迟调用。根据我的理解,不能保证当它第一次开火时,它来自请求。当然,我也只查看URL是否匹配。那么,我想假设我们得到了正确的requestId是相当安全的,而且匹配URL也不是很简单。例如,可以添加尾部斜杠callback@PatrickEvans我可以安装onBeforeRequest侦听器并从中获取请求id,然后立即删除侦听器。尽管如此,它仍将被延迟调用。根据我的理解,不能保证当它第一次开火时,它来自请求。当然,我也只查看URL是否匹配。那么,我想假设我们得到了正确的requestId是相当安全的,而且匹配URL也不是很简单。例如,可以添加尾部斜杠。