Poco :: Net :: HTTPClientSession json数据内容types未收到

所以我正在开发一个服务器端Nodejs / expressjs应用程序和一个客户端c ++ / Poco应用程序。 我已经设法创build一个服务器托pipe和客户端之间的会话。 但是,任何时候我尝试发送我的JSON负载,express.js显示req.body为空。

Google除了Content-Type可能没有被正确传输外,并没有透露太多的东西。 我确实明确,但显然我错过了一步。

客户端

void upload(std::list<std::string>& args) { if (args.size() == 0 || args.front() == "--help") { help("upload"); return; } std::string repo = args.front(); args.pop_front(); std::string name, language; auto depends = getDepends(name, language); // start making the poco json object here Poco::JSON::Object obj; obj.set("name", name); obj.set("url", repo); Poco::URI uri("http://url-of-my-server:50001/make_repo"); std::string path(uri.getPathAndQuery()); if (path.empty()) path = "/"; HTTPClientSession session(uri.getHost(), uri.getPort()); HTTPRequest request(HTTPRequest::HTTP_POST, path, HTTPMessage::HTTP_1_1); HTTPResponse response; std::ostream& o = session.sendRequest(request); std::cout << response.getStatus() << " " << response.getReason() << std::endl; session.setKeepAlive(true); request.setContentType("application/json"); // definately set Content-Type right? obj.stringify(std::cout); // can confirm it is spitting out the valid json here obj.stringify(o); // place the json in the request stream std::istream& s = session.receiveResponse(response); // do stuff with returned data } 

服务器:

 var express = require('express'); var app = express(); var bodyParser = require('body-parser'); var database = require('./database.js'); // one of my files var connection = database.connection; app.use(bodyParser.urlencoded({extended: true})); app.use(bodyParser.json()); var port = 50001; // explicitly set port because environment port kept forcing port 3000 // just a callback to make sure i'm connected to my sql server connection.query('SELECT 1',function(err, rows) { if(err) { console.error("Could not connect to the database."); } else { console.log('connected to database: ' + connection.threadId); } app.get('/', function(req, res){ res.send('hello world'); }); // this is the route I invoke, (and it is definately invoked) app.post('/make_repo', function(req, res, next) { console.log(req.headers); // this always returns '{ connection: 'Close', host: 'url-of-my-server:50001' } console.log(req.body); // this always returns '{}' }); var listener = app.listen(port, function() { console.log("port: " + listener.address().port); }); }); 

看起来,这是波科的目的,因为我可以传递邮递员的testing数据,它报告就好。 我也在Poco上设定了保持真实的状态,这似乎也被忽略了。 有没有人使用Poco足够的帮助?

被有状态的沟通风格所困惑。 这是http,在技术上还是一个无状态的连接。 所有有关请求的信息,除了身体之外,都必须在发送初始请求之前完成。

 HTTPClientSession session(uri.getHost(), uri.getPort()); HTTPRequest request(HTTPRequest::HTTP_POST, path, HTTPMessage::HTTP_1_1); HTTPResponse response; std::stringstream ss; obj.stringify(ss); request.setKeepAlive(true); request.setContentLength(ss.str().size()); request.setContentType("application/json"); // definately set Content-Type right? std::ostream& o = session.sendRequest(request); obj.stringify(o); // can confirm it is spitting out the valid std::cout << response.getStatus() << " " << response.getReason() << std::endl; 

此外,需要设置contentLength,我曾尝试之前,但由于内容types没有正确发送不工作。 内容长度和types设置正确后,服务器正确接收没有问题。