webRequest

为 HTTP 请求的各个阶段添加事件监听器,包括 ws://wss:// 上的 WebSocket 请求。事件监听器会接收有关请求的详细信息,并可以修改或取消请求。

每个事件在请求的特定阶段触发。事件顺序如下:

Order of requests is onBeforeRequest, onBeforeSendHeader, onSendHeaders, onHeadersReceived, onResponseStarted, and onCompleted. The onHeadersReceived can cause an onBeforeRedirect and an onAuthRequired. Events caused by onHeadersReceived start at the beginning onBeforeRequest. Events caused by onAuthRequired start at onBeforeSendHeader.

但是,扩展程序并非一定会观察到所有这些事件。例如,当重定向目标不匹配事件 filter.urls 时,onBeforeRedirect 可能不会紧接着 onBeforeRequest 触发。这可能是因为过滤器中的 URL 定义得很窄,或者扩展程序无法观察到重定向目标,例如当它重定向到 data: URL 时。

onErrorOccurred 可以在请求期间的任何时间触发。另外请注意,事件顺序有时可能与此不同。例如,在 Firefox 中,对于 HSTS 升级,onBeforeRedirect 事件会在 onBeforeRequest 之后立即触发。如果 Firefox 跟踪保护阻止了某个请求,也会触发 onErrorOccurred

所有事件——除了 onErrorOccurred——都可以接受三个参数给 addListener()

  • 监听器本身
  • 一个 filter 对象,因此您只能接收到特定 URL 或特定类型资源的请求通知。
  • 一个可选的 extraInfoSpec 对象。您可以使用它来传递其他事件特定的指令。

监听器函数会接收一个包含请求信息的 details 对象。其中包括一个请求 ID,该 ID 用于使附加组件能够关联与单个请求相关的事件。它在浏览器会话和附加组件的上下文中是唯一的。在整个请求过程中,即使在重定向和身份验证交换过程中,它也会保持不变。

要为给定主机使用 webRequest API,扩展程序必须具有 "webRequest" API 权限以及该主机的 主机权限。要使用 "blocking" 功能,扩展程序还必须拥有 "webRequestBlocking" API 权限。

要拦截由页面加载的资源(如图像、脚本或样式表),扩展程序必须同时拥有该资源的权限以及请求该资源的主页面的主机权限。例如,如果一个位于 https://mdn.org.cn 的页面从 https://mdn.mozillademos.org 加载图像,那么扩展程序必须同时拥有这两个主机权限才能拦截图像请求。

修改请求

在某些事件中,您可以修改请求。具体来说,您可以:

要执行此操作,您需要向事件的 addListener()extraInfoSpec 参数中传递一个值为 "blocking" 的选项。这将使监听器变为同步。

在监听器中,您可以返回一个 BlockingResponse 对象,该对象指示您需要进行的修改:例如,您想要发送的已修改的请求头。

浏览器启动时的请求

当使用 "blocking" 选项注册监听器并在扩展程序启动期间注册时,如果在浏览器启动期间发生的请求与监听器匹配,则扩展程序会提前启动。这使得扩展程序能够在浏览器启动时观察到该请求。如果您不采取这些步骤,可能会错过启动时的请求。

推测性请求

浏览器可以进行推测性连接,即它确定可能很快会向某个 URI 发出请求。这种类型的连接不提供有效的标签页信息,因此诸如 tabIdframeIdparentFrameId 等请求详细信息不准确。这些连接的 webRequest.ResourceTypespeculative

访问安全信息

onHeadersReceived 监听器中,您可以通过调用 getSecurityInfo() 来访问请求的 TLS 属性。要执行此操作,您还必须在事件的 addListener()extraInfoSpec 参数中传递 "blocking"。

您可以读取 TLS 握手的详细信息,但不能修改它们或覆盖浏览器的信任决定。

修改响应

要修改请求的 HTTP 响应体,请调用 webRequest.filterResponseData,并将请求 ID 传递给它。这将返回一个 webRequest.StreamFilter 对象,您可以使用它来检查和修改浏览器接收到的数据。

要执行此操作,您必须拥有 "webRequestBlocking" API 权限以及 "webRequest" API 权限以及相关主机的 主机权限

类型

webRequest.BlockingResponse

当事件监听器在其 extraInfoSpec 参数中设置了 "blocking" 时,会返回此类型的对象。通过在 BlockingResponse 中设置特定属性,监听器可以修改网络请求。

webRequest.CertificateInfo

描述单个 X.509 证书的对象。

webRequest.HttpHeaders

HTTP 头的数组。每个头表示为一个对象,具有两个属性:namevaluebinaryValue

webRequest.RequestFilter

描述应用于 webRequest 事件的过滤器的对象。

webRequest.ResourceType

表示 Web 请求中获取的特定类型的资源。

webRequest.SecurityInfo

描述特定 Web 请求安全属性的对象。

webRequest.StreamFilter

一个用于在接收 HTTP 响应时进行监视和修改的对象。

webRequest.UploadData

包含 URL 请求中上传的数据。

属性

webRequest.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES

在 10 分钟内可以调用 handlerBehaviorChanged() 的最大次数。

方法

webRequest.handlerBehaviorChanged()

此方法可用于确保在页面位于浏览器内存缓存中时正确应用事件监听器。

webRequest.filterResponseData()

返回给定请求的 webRequest.StreamFilter 对象。

webRequest.getSecurityInfo()

获取与给定请求关联的 TLS 连接的详细信息。

事件

webRequest.onBeforeRequest

当请求即将发起,并且在头可用之前触发。如果您想取消或重定向请求,这是一个很好的监听时机。

webRequest.onBeforeSendHeaders

在发送任何 HTTP 数据之前,但在 HTTP 头可用之后触发。如果您想修改 HTTP 请求头,这是一个很好的监听时机。

webRequest.onSendHeaders

在发送头之前触发。如果在 onBeforeSendHeaders 中修改了头,您在这里会看到修改后的版本。

webRequest.onHeadersReceived

当请求的 HTTP 响应头接收到时触发。您可以使用此事件来修改 HTTP 响应头。

webRequest.onAuthRequired

当服务器要求客户端提供身份验证凭据时触发。监听器可以什么都不做,取消请求,或提供身份验证凭据。

webRequest.onResponseStarted

当接收到响应体的第一个字节时触发。对于 HTTP 请求,这意味着状态行和响应头都可用。

webRequest.onBeforeRedirect

当服务器发起的重定向即将发生时触发。

webRequest.onCompleted

请求完成时触发。

webRequest.onErrorOccurred

发生错误时触发。

扩展程序示例

浏览器兼容性

关于 Chrome 不兼容性的附加说明.

注意:此 API 基于 Chromium 的 chrome.webRequest API。本文档源自 Chromium 代码中的 web_request.json