我正在使用PHP / CURL,并希望通过设置下面的postfields数组将POST数据发送到我的phantomjs脚本:
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFieldArray);
curl_setopt($ch, CURLOPT_URL, $url);
$output = curl_exec($ch);
问题是我不知道如何解析phantomjs脚本中的POST请求。我正在使用webserver模块来公开脚本。
我怀疑https://github.com/benfoxall/phantomjs-webserver-example/blob/master/server.js可能有答案,但我不知道足够的javascript来判断是否正在解析帖子变量:
var service = server.listen(port, function(request, response) {
if(request.method == 'POST' && request.post.url){
var url = request.post.url;
request_page(url, function(properties, imageuri){
response.statusCode = 200;
response.write(JSON.stringify(properties));
response.write("\n");
response.write(imageuri);
response.close();
})
有人可以告诉我如何在这里解析POST请求吗?
答案 0 :(得分:1)
request.post
对象包含POST请求的正文。如果您的$postFieldArray
确实是一个数组,那么(至少根据this answer)PHP应该编码数组并使用内容类型x-www-form-urlencoded
将其发布到。实际上,根据PHP documentation:
将数组传递给CURLOPT_POSTFIELDS会将数据编码为multipart / form-data,而传递URL编码的字符串会将数据编码为application / x-www-form-urlencoded。
虽然API reference中没有明确说明,但此GitHub issue表明PhantomJS会将x-www-form-urlencoded
表单的内容公开为request.post
对象上的属性。这就是示例中似乎发生的事情(request.post.url
指的是表单字段url
)。最简单的检查方法是将request.post
对象记录到控制台,看看里面有什么。
但是,GitHub问题也暗示PhantomJS网络服务器不支持multipart/form-data
。因此,除非您准备更改为其他Web服务器,否则使用JSON对数据进行编码可能最简单。在PHP方面:
curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode(json_encode($postFieldArray)));
然后在PhantomJS方面:
var data = JSON.parse(request.post);