在PhantomJS中拦截带有自定义响应的请求?
有没有办法截获资源请求并直接从处理程序给它一个响应?大概是这样的:在PhantomJS中拦截带有自定义响应的请求?,phantomjs,Phantomjs,有没有办法截获资源请求并直接从处理程序给它一个响应?大概是这样的: page.onRequest(function(request){ request.reply({data: 123}); }); 我的用例是使用PhantomJS呈现调用我的API的页面。为了避免身份验证问题,我想截取所有对API的http请求,并手动返回响应,而不进行实际的http请求 onResourceRequest几乎可以做到这一点,但没有任何修改功能 我看到的可能性: 我可以将页面存储为Handlebar模板
page.onRequest(function(request){
request.reply({data: 123});
});
我的用例是使用PhantomJS呈现调用我的API的页面。为了避免身份验证问题,我想截取所有对API的http请求,并手动返回响应,而不进行实际的http请求
onResourceRequest
几乎可以做到这一点,但没有任何修改功能
我看到的可能性:
localhost
,并在那里有一个服务器来侦听和响应请求。这假设在localhost
上有一个开放的、未经身份验证的API版本是可以的页面添加数据。评估到页面的全局窗口对象。这与#1的问题相同:我需要事先知道页面需要什么数据,并编写每个页面特有的服务器端代码
我最近在用phantom js生成PDF时需要这样做。 它有点粗糙,但似乎有效
var page = require('webpage').create(),
server = require('webserver').create(),
totallyRandomPortnumber = 29522,
...
//in my actual code, totallyRandomPortnumber is created by a java application,
//because phantomjs will report the port in use as '0' when listening to a random port
//thereby preventing its reuse in page.onResourceRequested...
server.listen(totallyRandomPortnumber, function(request, response) {
response.statusCode = 200;
response.setHeader('Content-Type', 'application/json;charset=UTF-8');
response.write(JSON.stringify({data: 'somevalue'}));
response.close();
});
page.onResourceRequested = function(requestData, networkRequest) {
if(requestData.url.indexOf('interceptme') != -1) {
networkRequest.changeUrl('http://localhost:' + totallyRandomPortnumber);
}
};
在我的实际应用程序中,我将一些数据发送到phantomjs以覆盖请求/响应,因此我将对server.listen和page.onResourceRequested中的URL进行更多检查。
这感觉像是一个穷人的拦截器,但它应该能让你(或任何与此相关的人)继续前进。你说得对,这在PhantomJS中是不容易实现的。看见它适用于CasperJS,但也适用于PhantomJS。似乎您考虑得太多了,您可以使用服务器端编程语言编写集成/单元测试。由于它是您的API,您应该可以访问源代码,因此可以根据需要模拟请求/响应。