通过 POST 请求将数据从 node.js 服务器发送到 node.js 服务器
Posted
技术标签:
【中文标题】通过 POST 请求将数据从 node.js 服务器发送到 node.js 服务器【英文标题】:Sending data through POST request from a node.js server to a node.js server 【发布时间】:2012-04-03 19:43:07 【问题描述】:我正在尝试通过 POST
请求从 node.js 服务器向另一个 node.js 服务器发送数据。我在“客户端”node.js 中所做的如下:
var options =
host: 'my.url',
port: 80,
path: '/login',
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.on('error', function(e)
console.log('problem with request: ' + e.message);
);
// write data to request body
req.write('data\n');
req.write('data\n');
req.end();
这个块或多或少取自 node.js 网站,所以它应该是正确的。我唯一没有看到的是如何在options
变量中包含用户名和密码以实际登录。这就是我在服务器 node.js 中处理数据的方式(我使用 express):
app.post('/login', function(req, res)
var user = ;
user.username = req.body.username;
user.password = req.body.password;
...
);
如何将username
和password
字段添加到options
变量以使其登录?
谢谢
【问题讨论】:
HTTP POST request in node.js的可能重复 【参考方案1】:发布数据就是发送一个查询字符串(就像您在?
之后使用 URL 发送它的方式一样)作为请求正文。
这需要Content-Type
和Content-Length
标头,因此接收服务器知道如何解释传入的数据。 (*)
var querystring = require('querystring');
var http = require('http');
var data = querystring.stringify(
username: yourUsernameValue,
password: yourPasswordValue
);
var options =
host: 'my.url',
port: 80,
path: '/login',
method: 'POST',
headers:
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(data)
;
var req = http.request(options, function(res)
res.setEncoding('utf8');
res.on('data', function (chunk)
console.log("body: " + chunk);
);
);
req.write(data);
req.end();
(*) 发送数据需要正确设置 Content-Type 标头,即标准 html 表单将使用的传统格式为 application/x-www-form-urlencoded
。
以完全相同的方式发送 JSON (application/json
) 很容易;只是JSON.stringify()
事先的数据。
URL 编码的数据支持一级结构(即键和值)。在交换具有嵌套结构的数据时,JSON 非常有用。
底线是:服务器必须能够解释相关内容类型。可以是text/plain
或其他任何东西;如果接收服务器按原样理解数据,则无需转换数据。
如果您的数据采用不常见的字符集(即不是 UTF-8),请添加字符集参数(例如 application/json; charset=Windows-1252
)。例如,如果您从文件中读取它,这可能是必要的。
【讨论】:
关于“Content-Type”的好答案:“application/x-www-form-urlencoded”,我一直在搜索,谢谢! 正确的解释和完美的编码。 在您发布数据时,假设是req.write(data);
执行此操作,在从服务器输出响应数据的终端中,如何将其收集到变量中?【参考方案2】:
你也可以使用Requestify,我为nodeJS编写的一个非常酷且非常简单的HTTP客户端+它支持缓存。
执行 POST 请求只需执行以下操作:
var requestify = require('requestify');
requestify.post('http://example.com',
hello: 'world'
)
.then(function(response)
// Get the response body (JSON parsed or jQuery object for XMLs)
response.getBody();
);
【讨论】:
安装 requestify 失败。 node-gyp 重建不正常:代码 0 @marcel:它对我来说也很好用,你需要查看requestify
包的构建要素并先安装它们。
谢谢大家!即将推出的下一个版本将不再需要 python,因为 jQuery(目前用于解析 XML 响应,它作为可选依赖项从核心中退出(-:
这可以用来模仿表单帖子吗?
我试过了,我的 POST 请求的正文部分有问题以上是关于通过 POST 请求将数据从 node.js 服务器发送到 node.js 服务器的主要内容,如果未能解决你的问题,请参考以下文章
将 Node.js GET /POST 请求更改为 Ajax