Node.js没有发送正确的POST消息

时间:2013-02-03 12:47:01

标签: node.js

我在node.js中有这样的代码:

var requestData = JSON.stringify({ id : data['user_id'] });
var options = {
    hostname: 'localhost',
    port: 80,
    path: '/mypath/index.php',
    method: 'POST',
    headers: {
        "Content-Type": "application/json",
        'Content-Length': requestData.length
    }
};

var req = http.request(options, function(res) {
    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log('BODY: ' + chunk);
    });
});

req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
});

// write data to request body
req.write(requestData); 
req.end();

和PHP代码:

<?php
    $data = $_POST;
    define('DS', '/');
    umask(000);
    file_put_contents(dirname( __FILE__ ).DS.'log.txt', json_encode($data), FILE_APPEND);
    echo json_encode($data);
?>

非常简单......但在发出node.js POST请求后 - PHP没有获取任何数据。我已经尝试了许多其他方法来向PHP发送POST消息,但对我来说没有任何作用。我的意思是,$_POST 总是为空。

还尝试了request nodejs库:

    request.post({
        uri : config.server.protocol + '://localhost/someurl/index.php',
        json : JSON.stringify({ id : data['user_id'] }),
        },
        function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log('returned BODY:', body);
        }
        def.resolve(function() {
            callback(error);
        });
    });

我的问题应该有一个非常简单的解决方案,但我找不到。

1 个答案:

答案 0 :(得分:3)

$_POST数组仅填充HTML表单POST提交。要模拟这样的表单提交,您需要:

  • 将请求Content-Type标头精确设置为application/x-www-form-urlencoded
  • 在请求正文中使用表单编码... I.E key=value&key2=value2并在必要时使用percent-encoding
  • 将Content-Length标头的值精确计算为正在发送的 bytes 的长度。只有在完全编码的字符串之后才能执行此操作,但是为了计算内容长度不需要字节转换,因为urlencoded字符串中的1个字符= 1个字节。

但是,使用您当前的代码(只要您提供的是ASCII),您也可以这样做:

<?php
    $data = json_decode(file_get_contents("php://input"));
    $error = json_last_error();
    if( $error !== JSON_ERROR_NONE ) {
        die( "Malformed JSON: " . $error );
    }

    define('DS', '/');
    umask(000);
    file_put_contents(dirname( __FILE__ ).DS.'log.txt', json_encode($data), FILE_APPEND);
    echo json_encode($data);
?>