如何将 POST 数据发送到虚拟脚本

How can I send POST data to a phantomjs script

本文关键字:虚拟 脚本 数据 POST      更新时间:2023-09-26

我正在使用 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 请求。我正在使用网络服务器模块来公开脚本。

我怀疑 https://github.com/benfoxall/phantomjs-webserver-example/blob/master/server.js 可能有答案,但我不知道足够的javascript来判断是否正在解析post变量:

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 请求吗?

request.post 对象包含 POST 请求的正文。如果你的$postFieldArray确实是一个数组,那么(至少根据这个答案)PHP 应该对数组进行编码并使用内容类型 x-www-form-urlencoded 对其进行 POST 。实际上,根据PHP文档:

将数组传递给CURLOPT_POSTFIELDS会将数据编码为多部分/表单数据,而传递 URL 编码的字符串会将数据编码为 application/x-www-form-urlencoded。

尽管在 API 参考中没有明确说明,但此 GitHub 问题表明 PhantomJS 会将x-www-form-urlencoded表单的内容公开为request.post对象的属性。这就是示例中似乎正在发生的事情(request.post.url指的是表单字段url)。最简单的检查方法是将request.post对象记录到控制台,并查看其中的内容。

但是,GitHub 问题也意味着 PhantomJS Web 服务器不支持multipart/form-data。因此,除非您准备更改为其他 Web 服务器,否则使用 JSON 对数据进行编码可能是最简单的方法。在 PHP 方面:

curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode(json_encode($postFieldArray)));

然后在PhantomJS方面:

var data = JSON.parse(request.post);