在PhantomJS中使用自定义响应拦截请求?

时间:2015-04-13 08:44:25

标签: phantomjs

有没有办法拦截资源请求并直接从处理程序给它一个响应?像这样:

page.onRequest(function(request){
   request.reply({data: 123});
});

我的用例是使用PhantomJS呈现调用我的API的页面。为了避免身份验证问题,我想拦截所有对API的http请求并手动返回响应,而不是发出实际的http请求。

onResourceRequest几乎可以做到这一点,但没有任何修改功能。

我看到的可能性:

  1. 我可以将页面存储为Handlebars模板,并将数据呈现到页面中,并将其作为原始html传递给PhantomJS(而不是URL)。虽然这样可行,但由于我必须为每个网页编写数据层,因此会使更改变得困难,而且网页不能单独存在。
  2. 我可以重定向到localhost,并在那里有一个服务器来监听和响应请求。这假设在localhost上有一个开放的,未经过身份验证的API版本是可以的。
  3. 通过page.evaluate将数据添加到网页的全局window对象中。这与#1有同样的问题:我需要事先知道页面需要什么数据,并编写每页唯一的服务器端代码。

1 个答案:

答案 0 :(得分:0)

我最近需要在使用幻像js生成pdf时执行此操作。 它有点hacky,但似乎有效。

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进行了更多检查。 这感觉就像一个穷人的拦截器,但它应该让你(或任何与此有关的人)去。