我正在开发一个扩展,其中无论发出什么请求,我都想更改请求参数并向服务器发送虚拟请求以获得响应。 例如。如果加载的原始请求是www.abc.com/eg.php?user="some code“,那么我想将其更改为www.abc.com/eg.php?user="ritubala”并获取html页面响应我的扩展程序内的进一步处理.. 我使用了以下网址中给出的这些代码 Return HTML content as a string, given URL. Javascript Function 但它导致递归... 所以简而言之,我想从我的扩展程序中的网址获取HTML代码... plz do help
答案 0 :(得分:1)
使用nsITraceableChannel
,请注意您获得了正在加载的内容的副本。
如果您中止请求,则会中止给您一份副本。
我在这里使用nsITraceableChannel:https://github.com/Noitidart/demo-nsITraceableChannel
我认为你想要的是:
const { Ci, Cu, Cc, Cr } = require('chrome'); //const {interfaces: Ci, utils: Cu, classes: Cc, results: Cr } = Components;
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/devtools/Console.jsm');
var observers = {
'http-on-examine-response': {
observe: function (aSubject, aTopic, aData) {
console.info('http-on-modify-request: aSubject = ' + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData);
var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
var requestUrl = httpChannel.URI.spec
if (requestUrl.indexOf('blah')) {
//httpChannel.cancel(Cr.NS_BINDING_ABORTED); //this is how you abort but if use redirectTo you don't need to abort the request
httpChannel.redirectTo(Services.io.newURI('http://www.anotherwebsite/', null, null));
}
},
reg: function () {
Services.obs.addObserver(observers['http-on-modify-request'], 'http-on-modify-request', false);
},
unreg: function () {
Services.obs.removeObserver(observers['http-on-modify-request'], 'http-on-modify-request');
}
}
};
//register all observers
for (var o in observers) {
observers[o].reg();
}
请注意redirectTo函数适用于FF20 + https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIHttpChannel#redirectTo%28%29
所以将此示例与nsITraceableChannel演示结合起来,您就可以拥有自己想要的内容。
如果您不想重定向,可以中止请求,获取请求的文档,然后xmlhttprequest新页面,它为您提供源FIRST并且不将其加载到选项卡,然后修改源然后将其加载回DOCUMENT。
OR而不是xmlhttprequest它,只需中止请求,重定向到新页面,然后修改选项卡。获取频道的标签请在此处查看解决方案:
Security Error when trying to load content from resource in a Firefox Addon (SDK)
也可以从扩展程序执行http请求,请参阅以下代码段:https://gist.github.com/Noitidart/9088113