0

我正在使用 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 来判断是否正在解析 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 请求吗?

4

1 回答 1

1

request.post对象包含 POST 请求的主体。如果您$postFieldArray确实是一个数组,那么(至少根据这个答案)PHP 应该对数组进行编码并使用 content typex-www-form-urlencoded发布它。实际上,根据PHP 文档

将数组传递给 CURLOPT_POSTFIELDS 会将数据编码为 multipart/form-data,而传递 URL 编码的字符串会将数据编码为 application/x-www-form-urlencoded。

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

但是,GitHub 问题也暗示multipart/form-dataPhantomJS 网络服务器不支持。因此,除非您准备更改为不同的 Web 服务器,否则使用 JSON 对数据进行编码可能是最简单的。在 PHP 方面:

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

然后在 PhantomJS 方面:

var data = JSON.parse(request.post);
于 2013-10-17T04:48:51.760 回答