POST для PHP из Node.js

Я пытаюсь отправить POST некоторые данные из приложения Node.js в PHP скрипт. Пока я просто строю доказательство концепции, но я не могу получить фактические данные на стороне PHP. Запрос проходит, и я получаю 200 обратно, но PHP считает, что массив $_POST пуст.

Вот мой код node:

// 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, но когда я делаю var_dump из $_POST, это пустой массив.

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

}

Я подозреваю, что что-то не так с методом .write(), но я не могу понять, что. Был бы признателен за любой вклад в то, что я пропускаю или делаю неправильно.

* Обновление:

В некоторых комментариях указывается использование file_get_contents ('php://input'); действительно работает, чтобы получить данные на стороне PHP, но я все же предпочел бы иметь возможность напрямую обращаться к массиву $_POST.

Ответ 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();