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
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();
解释
-
设置请求选项:
host
: 目标服务器的主机名。port
: 服务器监听的端口号。path
: 请求的路径。method
: 请求的方法,这里设置为POST
。
-
创建请求对象:
- 使用
http.request
创建一个 HTTP 请求对象req
。
- 使用
-
处理响应:
- 在回调函数中,你可以获取响应的状态码、头部信息以及响应体。
res.setEncoding('utf8')
设置响应体的编码格式为 UTF-8。res.on('data', function(chunk) { ... })
监听数据事件,每次接收到数据块时会触发该事件。
-
写入请求体:
req.write('name=liuzhang&age=29')
将数据写入请求体。注意,这里的数据格式需要符合 HTTP 协议的要求。
-
结束请求:
- 最后,调用
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(); // 结束请求体的写入
解释
-
req.write
和req.end
:- 使用
req.write
可以向请求体中写入数据。 - 使用
req.end
来结束请求体的写入,这会触发实际的 HTTP 请求发送。
- 使用
-
PHP 处理 POST 数据:
- 在 PHP 中,使用
$_POST
来获取 POST 请求的数据。 - 确保你的 PHP 脚本正确处理了请求体中的数据。例如:
- 在 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 端正确读取这些数据。