从 Node.js POST 到 PHP

Posted

技术标签:

【中文标题】从 Node.js POST 到 PHP【英文标题】:POST to PHP from Node.js 【发布时间】:2014-02-21 21:18:36 【问题描述】:

我正在尝试将一些数据从 Node.js 应用程序发布到 php 脚本。目前我只是在构建一个概念证明,但我无法将实际数据传递到 PHP 端。请求通过,我得到了 200,但 PHP 认为 $_POST 数组是空的。

这是我的节点代码:

// simple end point just for testing

exports.testPost = function(request, response) 
    data = request.body.data;

    postToPHP(data);

    response.end(data);


function postToPHP (data) 
    var http = require('http');

    var options = 
        host : 'localhost',
        port : 8050,
        path : '/machines/test/index.php',
        method : 'POST',
        headers : 
            'Content-Type' : 'application/json',
            'Content-Length' : Buffer.byteLength(data)
        
    ;

    var buffer = "";

    var reqPost = http.request(options, function(res) 
        console.log("statusCode: ", res.statusCode);

        res.on('data', function(d) 
            console.info('POST Result:\n');
            //process.stdout.write(d);
            buffer = buffer+data;
            console.info('\n\nPOST completed');

        );

        res.on('end', function() 
            console.log(buffer);
        );
    );

    console.log("before write: "+data);

    reqPost.write(data);
    reqPost.end();


再次,请求到达 localhost:8050/machines/test/index.php 但是当我执行 $_POST 的 var_dump 时,它是一个空数组。

[29-Jan-2014 21:12:44] array(0) 


我怀疑我的 .write() 方法做错了,但我不知道是什么。任何关于我遗漏或做错的输入将不胜感激。

* 更新:

正如一些 cmets 表明使用 file_get_contents('php://input');确实可以在 PHP 端获取数据,但我仍然希望能够直接访问 $_POST 数组。

【问题讨论】:

Issue reading HTTP request body from a JSON POST in PHP的可能重复 @Quentin 不,绝对不是。我尝试将 JSON 以外的其他方式传递给 PHP,但它仍然是一个空的 $_POST 数组。 “非 JSON”是否正确编码了 application/x-www-form-urlencoded 数据?您只向我们展示了不应填充$_POST的代码。 @Quentin 为什么不填充 $_POST?我相信这个问题的答案就是我正在寻找的答案。我也尝试了内置的查询字符串模块来创建一个正确编码的字符串,但 $_POST 仍然是空的。我错过了什么? (谢谢你的及时回复,顺便说一句!) 您需要从 php 读取原始输入的方式:file_get_contents("php://input"); 【参考方案1】:

由于您使用Content-Type: application/json 发送数据,因此您需要读取原始输入,因为 php 不知道如何将 json 读取到它们的全局变量中,例如 _GET 和 _POST,除非您有一些 php 扩展可以做到这一点。

您可以使用querystring 库将对象解析为名称-值对查询字符串,然后您可以使用Content-Type:application/x-www-form-urlencoded 进行传输,以便将数据解析为全局变量

var data = 
   var1:"something",
   var2:"something else"
;
var querystring = require("querystring");
var qs = querystring.stringify(data);
var qslength = qs.length;
var options = 
    hostname: "example.com",
    port: 80,
    path: "some.php",
    method: 'POST',
    headers:
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': qslength
    
;

var buffer = "";
var req = http.request(options, function(res) 
    res.on('data', function (chunk) 
       buffer+=chunk;
    );
    res.on('end', function() 
        console.log(buffer);
    );
);

req.write(qs);
req.end();

【讨论】:

我将如何调整此解决方案以处理传入数据,例如:"["name":"test1", "value":"10","name":"test2" “价值”:“20”]”?由于显而易见的原因,我无法让 qs 助手对其进行字符串化。 @NicholasKreidberg,如果您的意思是来自 php JSON.parse(buffer) 的数据,否则如果您的意思是变量数据是否包含该字符串,则只需先将其解析为对象 data = myArray:JSON.parse(data);,然后再将其传递给字符串化和然后在 php 中捕获$_POST['myArray'] 那是最有帮助的!要让相同的示例在 HTTPS 上运行需要什么? 我最终使用了“请求”模块,并且通过 HTTPS 运行良好。我仍然会对如何使用本机模块进行操作感到好奇,但目前功能正是我需要的地方。再次感谢! 工作得很好,虽然以一种妥协的方式!

以上是关于从 Node.js POST 到 PHP的主要内容,如果未能解决你的问题,请参考以下文章

从 Node.js POST 到 PHP

node.js 学习01

从 Angular 2 客户端到 Node.js 服务器的 HTTP POST 请求

Node.js机制及原理理解初步

从 POST 访问中隐藏 Node.js&Express 中的错误消息

来自 node.js 服务器的 Ajax POST [重复]