Я пытаюсь POST некоторые данные из приложения 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, но когда я делаю var_dump из $ _POST, это пустой массив.
[29-Jan-2014 21:12:44] array(0) { }
Я подозреваю, что что-то не так с методом .write (), но я не могу понять, что. Был бы признателен за любой вклад в то, что я пропускаю или делаю неправильно.
* Обновление:
Поскольку некоторые из комментариев указывают на использование file_get_contents ('php: // input'); действительно работает, чтобы получить данные на стороне PHP, но я все же предпочел бы иметь возможность напрямую обращаться к массиву $ _POST.
Поскольку вы отправляете данные с помощью 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();
-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();