通过POST请求从node.js服务器向node.js服务器发送数据

Sending data through POST request from a node.js server to a node.js server

我正在尝试通过POST请求从node.js服务器向另一个node.js服务器发送数据。 我在"client"node.js中所做的如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
');
req.write('data
');
req.end();

这个块或多或少来自node.js网站,所以它应该是正确的。 我唯一没看到的是如何在options变量中包含用户名和密码来实际登录。 这就是我如何处理服务器node.js中的数据(我使用express):

1
2
3
4
5
6
app.post('/login', function(req, res){
    var user = {};
    user.username = req.body.username;
    user.password = req.body.password;
        ...
});

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

谢谢


发布数据是一个发送查询字符串的问题(就像在?之后使用URL发送它一样)作为请求主体。

这需要Content-TypeContent-Length标头,因此接收服务器知道如何解释传入数据。 (*)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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标头,即application/x-www-form-urlencoded表示标准HTML表单将使用的传统格式。

以完全相同的方式发送JSON(application/json)很容易;事先只需JSON.stringify()数据。

URL编码数据支持一级结构(即键和值)。在交换具有嵌套结构的数据时,JSON非常有用。

底线是:服务器必须能够解释有问题的内容类型。它可能是text/plain或其他任何东西;如果接收服务器理解它,则无需转换数据。

如果您的数据是一个不寻常的字符集,即不是UTF-8,请添加一个charset参数(例如application/json; charset=Windows-1252)。例如,如果您从文件中读取它,则可能需要这样做。


您还可以使用Requestify,这是我为nodeJS +编写的非常酷且非常简单的HTTP客户端,它支持缓存。

只需执行以下操作即可执行POST请求:

1
2
3
4
5
6
7
8
9
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();
});