0

我无法让我的 node.js 服务器向另一个 node.js 服务器发出 http POST 请求。我相当确定问题出在 http 库或我如何使用它,因为我可以编写一个小的 HTML 页面来完全按照我的意愿执行 POST。

以下是接收 POST 的服务器的设置方式

var server = restify.createServer({
   name: 'some server',
   version: "1.0.0"
});

server.use(restify.acceptParser(server.acceptable));
server.use(restify.bodyParser());    
server.post('/theurl/', handler.handlePost);

server.listen(config.port, function() {
   console.log("starting server on port %d", server.address().port);
});

在 handlePost 方法中,我正在这样做:

exports.handlePost = function(req, res, next) {
   console.log("body: %s", JSON.stringify(req.body));
   console.log("params: %s", JSON.stringify(req.params));
}

这是发送 POST 的服务器的操作方式(直接取自node.js http docs

var options = {
   host: '127.0.0.1',
   port: 8090,
   path: '/theurl/',
   method: 'POST'
};

var req = http.request(options, function(res) {
   ses.setEncoding('utf8');
   res.on('data', function (chunk) {
      console.log('BODY: ' + chunk);
   });
});

req.on('error', function(e) {
   console.log('problem with request: ' + e.message);
});

req.write("<some>xml</some>");
req.end();

当我运行 POST 时,在 handlePost 方法中 req.body 和 req.params 都是未定义的。

但是,如果我将以下 HTML 放在浏览器中,我可以发布到服务就好了。

<html>
   <head>
     <script>
       function doPost()
       {
         var xmlhttp = new XMLHttpRequest();
         xmlhttp.open("POST","http://localhost:8090/theurl/",false);
         xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
         xmlhttp.send("<some>xml</some>");
       }
     </script>
   </head>
   <body>
      <button type="button" onclick="doPost()">POST data</button>   
   </body>
</html>

那么我对 node.js http 库做错了吗?

4

3 回答 3

2

好吧,就在我发布这个之后,我意识到我在 HTML 版本中做的一件事我在 node.js 版本中没有做的是在请求中设置 Content-Type。如果我将选项更改为此,它会起作用:

var options = {
   host: '127.0.0.1',
   port: 8090,
   path: '/theurl/',
   method: 'POST',
   headers: { "Content-type": "application/x-www-form-urlencoded" }
};
于 2012-10-24T04:10:45.740 回答
0

使用下面的代码

var querystring = require('querystring');

    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': data.length
        }
    };

    var req = http.request(options, function(res) {
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            console.log("body: " + chunk);
        });
    });

    req.write(data);
    req.end();
于 2013-08-22T12:34:52.273 回答
-1

确保您在app.js文件中添加了这些内容:

var bodyParser = require('body-parser'); // npm i body-parser

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
于 2020-10-20T19:12:13.003 回答