Nodejs request 的一个问题

Nodejs request 的一个问题

var options = { host: ‘localhost’, port: 80, path: ‘/backbone/data.php’, method: ‘POST’ };

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); }); }); // write data to request body req.write(‘name=liuzhang&age=29’);

为什么用$_POST是空的,我已经res.write


4 回复

Node.js request 的一个问题

问题描述

你正在使用 Node.js 的 http.request 方法向服务器发送一个 POST 请求,并且你希望将数据通过 POST 方法传递给服务器。然而,你在服务器端(例如 PHP)使用 $_POST 获取请求的数据时,发现它是空的。你已经尝试了使用 req.write 方法来写入请求体,但似乎没有达到预期的效果。

示例代码

var http = require('http');

var options = {
    host: 'localhost',
    port: 80,
    path: '/backbone/data.php',
    method: 'POST'
};

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.write('name=liuzhang&age=29');

// 结束请求
req.end();

解释

  1. 设置请求选项

    • host: 目标服务器的主机名。
    • port: 服务器监听的端口号。
    • path: 请求的路径。
    • method: 请求的方法,这里设置为 POST
  2. 创建请求对象

    • 使用 http.request 创建一个 HTTP 请求对象 req
  3. 处理响应

    • 在回调函数中,你可以获取响应的状态码、头部信息以及响应体。
    • res.setEncoding('utf8') 设置响应体的编码格式为 UTF-8。
    • res.on('data', function(chunk) { ... }) 监听数据事件,每次接收到数据块时会触发该事件。
  4. 写入请求体

    • req.write('name=liuzhang&age=29') 将数据写入请求体。注意,这里的数据格式需要符合 HTTP 协议的要求。
  5. 结束请求

    • 最后,调用 req.end() 来结束请求并发送数据。

问题原因

在 PHP 中,$_POST 变量用于接收通过 POST 方法提交的数据。然而,在 Node.js 中,如果你只是简单地使用 req.write 方法来写入请求体,而没有正确地设置请求头中的 Content-Type,PHP 可能无法正确解析 POST 数据。

解决方案

你需要在请求选项中添加 Content-Type 头,以告知服务器请求体的格式。例如:

var options = {
    host: 'localhost',
    port: 80,
    path: '/backbone/data.php',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    }
};

这样,PHP 应该能够正确解析 POST 数据了。


加上eq.end(); 或者直接用req.end(‘name=liuzhang&age=29’);

已解决了!php $_POST 只能Content-Type:pplication/x-www-form-urlencoded

在你的代码中,有几个需要注意的地方。首先,req.write 应该改为 req.end 来结束请求体的写入。其次,确保你的 PHP 端正确处理了请求体。

示例代码

var http = require('http');

var options = {
    host: 'localhost',
    port: 80,
    path: '/backbone/data.php',
    method: 'POST'
};

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);
    });
});

// write data to request body
req.write('name=liuzhang&age=29');
req.end(); // 结束请求体的写入

解释

  1. req.writereq.end:

    • 使用 req.write 可以向请求体中写入数据。
    • 使用 req.end 来结束请求体的写入,这会触发实际的 HTTP 请求发送。
  2. PHP 处理 POST 数据:

    • 在 PHP 中,使用 $_POST 来获取 POST 请求的数据。
    • 确保你的 PHP 脚本正确处理了请求体中的数据。例如:
<?php
$name = isset($_POST['name']) ? $_POST['name'] : '';
$age = isset($_POST['age']) ? $_POST['age'] : '';

echo "Name: $name\n";
echo "Age: $age\n";
?>

常见问题

  • 如果你在 PHP 中发现 $_POST 是空的,可能是因为:
    • 请求体没有正确发送(确保使用 req.end())。
    • 请求方法不正确(确保使用 POST 方法)。
    • PHP 配置问题(如 php.ini 中的 post_max_size 设置)。

通过以上修改,你应该能够正确地将 POST 数据发送到服务器,并在 PHP 端正确读取这些数据。

回到顶部