在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
几乎可以做到这一点,但没有任何修改功能

我看到的可能性:

  • 我可以将页面存储为Handlebar模板,将数据呈现到页面中,并将其作为原始html传递给PhantomJS(而不是URL)。虽然这会起作用,但它会使更改变得困难,因为我必须为每个网页编写数据层,而网页不能单独存在
  • 我可以重定向到
    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,您应该可以访问源代码,因此可以根据需要模拟请求/响应。