【问题标题】:Intercept Requests With Custom Responses in PhantomJS?在 PhantomJS 中使用自定义响应拦截请求?
【发布时间】:2015-04-13 08:44:25
【问题描述】:

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

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 存在相同的问题:我需要先了解页面需要哪些数据,并为每个页面编写唯一的服务器端代码。

【问题讨论】:

  • 你是对的,这对于 PhantomJS 来说并不容易。见my answer here。它适用于 CasperJS,但也适用于 PhantomJS。
  • 您似乎想多了,您可以使用服务器端编程语言编写集成/单元测试。由于它是您的 API,您应该可以访问源代码,因此您可以根据需要模拟请求/响应。

标签: phantomjs


【解决方案1】:

我最近在使用 phantom 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 进行更多检查。 这感觉就像一个穷人拦截器,但它应该让你(或任何可能涉及的人)继续前进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2018-04-19
    • 2018-01-07
    • 1970-01-01
    相关资源
    最近更新 更多