通过 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;
        ...
);

如何将usernamepassword 字段添加到options 变量以使其登录?

谢谢

【问题讨论】:

HTTP POST request in node.js 的可能重复项 【参考方案1】:

发布数据就是发送一个查询字符串(就像您在? 之后使用 URL 发送它的方式一样)作为请求正文。

这需要Content-TypeContent-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 POST API 和请求正文的解析

将 Node.js GET /POST 请求更改为 Ajax

从 Node.js POST 到 PHP

监听 POST 请求、解析服务器、node.js

从 Angular 2 客户端到 Node.js 服务器的 HTTP POST 请求

从 Swift 4 向 Node.js 发送 post 请求