5.2 网络请求

优质
小牛编辑
141浏览
2023-12-01

Chrome提供了较为完整的方法供扩展程序分析、阻断及更改网络请求,同时也提供了一系列较为全面的监听事件以监听整个网络请求生命周期的各个阶段。网络请求的整个生命周期所触发事件的时间顺序如下图所示。

enter image description here
网络请求的生命周期,图片来自developer.chrome.com

要对网络请求进行操作,需要在Manifest中声明webRequest权限以及相关被操作的URL。如需要阻止网络请求,需要声明webRequestBlocking权限。

"permissions": [
    "webRequest",
    "webRequestBlocking",
    "*://*.google.com/"
]

上面的权限声明表示此扩展可以对浏览器向Google发起的网络请求进行更改。webRequest接口无法在Event Page中使用。

目前对于网络请求,比较实用的功能包括阻断连接、更改header和重定向。

下面的代码阻断了所有向bad.example.com的连接:

chrome.webRequest.onBeforeRequest.addListener(
    function(details){
        return {cancel: true};
    },
    {
        urls: [
            "*://bad.example.com/*"
        ]
    },
    [
        "blocking"
    ]
);

而下面的代码则将所有连接中的User-Agent信息都删除了:

chrome.webRequest.onBeforeSendHeaders.addListener(
    function(details){
        for(var i=0, headerLen=details.requestHeaders.length; i<headerLen; ++i){
            if(details.requestHeaders[i].name == 'User-Agent'){
                details.requestHeaders.splice(i, 1);
                break;
            }
        }
        return {requestHeaders: details.requestHeaders};
    },
    {
        urls: [
            "<all_urls>"
        ]
    },
    [
        "blocking",
        "requestHeaders"
    ]
);

需要注意的是,header中的如下属性是不支持更改的:AuthorizationCache-ControlConnectionContent-LengthHostIf-Modified-SinceIf-None-MatchIf-RangePartial-DataPragmaProxy-AuthorizationProxy-ConnectionTransfer-Encoding

下面的代码将所有访问www.google.com.hk的请求重定向到了www.google.com:

chrome.webRequest.onBeforeRequest.addListener(
    function(details){
        return {redirectUrl: details.url.replace( "www.google.com.hk", "www.google.com")};
    },
    {
        urls: [
            "*://www.google.com.hk/*"
        ]
    },
    [
        "blocking"
    ]
);

想想我们是不是可以做一个本地的JS Library CDN呢?

所有事件中,回调函数所接收到的信息对象均包括如下属性:requestIdurlmethodframeIdparentFrameIdtabIdtypetimeStamp。其中type可能的值包括"main_frame""sub_frame""stylesheet""script""image""object""xmlhttprequest""other"

除了onBeforeRequestonErrorOccurred事件外,其他所有事件返回的信息对象均包含HttpHeaders属性;onHeadersReceivedonAuthRequiredonResponseStartedonBeforeRedirectonCompleted事件均包括statusLine属性以显示请求状态,如'HTTP/0.9 200 OK'。其他的属性还包括schemerealmchallengerisProxyipfromCachestatusCoderedirectUrlerror等,由于使用范围较小,在此不详细介绍,读者可自行到http://developer.chrome.com/extensions/webRequest阅读完整内容。