gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:47:32 30 4
gpt4 key购买 nike

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

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 具有相同的问题:我需要先验地知道页面需要哪些数据,并编写每个页面唯一的服务器端代码。

最佳答案

我最近在使用 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 - 在 PhantomJS 中使用自定义响应拦截请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29601224/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com