1

我在 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 没有获取任何数据。我已经尝试了许多其他将 POST 消息发送到 PHP 的方法,但对我来说没有任何效果。我的意思是,$_POST总是的。

还尝试请求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);
        });
    });

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

4

1 回答 1

3

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

  • 将请求 Content-Type 标头完全设置为application/x-www-form-urlencoded
  • 在请求正文中使用表单编码... IE必要时key=value&key2=value2使用百分比编码。
  • 将 Content-Length 标头的值精确计算为正在发送的字节长度。您只能在获得完全编码的字符串后执行此操作,尽管不需要字节转换来计算 Content-Length,因为 1 个字符 = urlencoded 字符串中的 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);
?>
于 2013-02-03T12:56:56.840 回答