从 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,如果您的意思是来自 phpJSON.parse(buffer)
的数据,否则如果您的意思是变量数据是否包含该字符串,则只需先将其解析为对象 data = myArray:JSON.parse(data);
,然后再将其传递给字符串化和然后在 php 中捕获$_POST['myArray']
。
那是最有帮助的!要让相同的示例在 HTTPS 上运行需要什么?
我最终使用了“请求”模块,并且通过 HTTPS 运行良好。我仍然会对如何使用本机模块进行操作感到好奇,但目前功能正是我需要的地方。再次感谢!
工作得很好,虽然以一种妥协的方式!以上是关于从 Node.js POST 到 PHP的主要内容,如果未能解决你的问题,请参考以下文章
从 Angular 2 客户端到 Node.js 服务器的 HTTP POST 请求