2012-10-24 193 views
0

我無法讓我的node.js服務器對另一個node.js服務器執行http POST請求。我相當肯定,問題在於http庫或我如何使用它,因爲我可以編寫一個完全按照我的意願執行POST的小型HTML頁面。node.js http 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服務器是如何這樣做(這是直接從the 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庫?

回答

1

好吧,在我發佈這篇文章之後,我意識到我在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" } 
}; 
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(); 
代碼