5.2 网络请求
Chrome提供了较为完整的方法供扩展程序分析、阻断及更改网络请求,同时也提供了一系列较为全面的监听事件以监听整个网络请求生命周期的各个阶段。网络请求的整个生命周期所触发事件的时间顺序如下图所示。
网络请求的生命周期,图片来自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
中的如下属性是不支持更改的:Authorization
、Cache-Control
、Connection
、Content-Length
、Host
、If-Modified-Since
、If-None-Match
、If-Range
、Partial-Data
、Pragma
、Proxy-Authorization
、Proxy-Connection
和Transfer-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呢?
所有事件中,回调函数所接收到的信息对象均包括如下属性:requestId
、url
、method
、frameId
、parentFrameId
、tabId
、type
和timeStamp
。其中type
可能的值包括"main_frame"
、"sub_frame"
、"stylesheet"
、"script"
、"image"
、"object"
、"xmlhttprequest"
和"other"
。
除了onBeforeRequest
和onErrorOccurred
事件外,其他所有事件返回的信息对象均包含HttpHeaders
属性;onHeadersReceived
、onAuthRequired
、onResponseStarted
、onBeforeRedirect
和onCompleted
事件均包括statusLine
属性以显示请求状态,如'HTTP/0.9 200 OK'
。其他的属性还包括scheme
、realm
、challenger
、isProxy
、ip
、fromCache
、statusCode
、redirectUrl
和error
等,由于使用范围较小,在此不详细介绍,读者可自行到http://developer.chrome.com/extensions/webRequest阅读完整内容。