今天我在phantomjs中遇到了一个非常奇怪的错误,我正转向社区。我没有返回使用phantomJS调用的API的预期JSON响应,而是结果是失败状态。
onResourceReceived()显示了相关资源的200 http状态代码 onLoadFinished()显示失败状态
经过一段时间调试后,我注意到该网站在响应中返回了非标准的内容类型标题。而不是内容类型的“application / json”,返回的标题是“application / servicename-1.0 + json”。
为了验证这一点,我们启动了一个服务于类似标题的本地网络服务器,并确定幻像js无法加载页面。将响应头设置为“application / json”和phantomjs正确呈现页面并设置页面对象page.plainText变量。我在下面列出了测试脚本。
有没有人遇到过这样的事情?
有关如何在phantomjs中处理此问题的任何建议吗?
答案 0 :(得分:1)
我能想到的最简单,最快捷的解决方案(不涉及编辑PhantomJS的源代码并编译它)是在PhantomJS前面设置一个简单的本地代理服务器,它会重写不正确的标头。
它可能像fiddler2,Charles Proxy或一个简单的node.js脚本,就像这个快速脏的例子:
// npm install proxy-tamper
var proxy = require('proxy-tamper').start({port: 3000});
proxy.tamper(/api.truelocal.com.au.*$/, function (request) {
request.onResponse(function (response) {
if ('content-type' in response.headers && response.headers['content-type'] == 'application/servicename-1.0+json') {
response.headers['content-type'] = 'application/json';
}
response.complete();
});
});
然后让PhantomJS使用它:
phantomjs --proxy=127.0.0.1:3000 script.js
请注意,这不适用于安全页面。
答案 1 :(得分:1)
嗯,在提出这个问题之后,我在phantomjs来源中做了更深入的研究。看起来在application / json上有一些相当严格的检测:https://github.com/Vitallium/qtwebkit/blob/phantomjs/Source/WebCore/dom/DOMImplementation.cpp#L368