Fat*_*sis 3 c++ json http node.js poco-libraries
因此,我正在开发服务器端Nodejs / expressjs应用程序和客户端c ++ / Poco应用程序。我设法在托管服务器和客户端之间创建会话。但是,无论何时我尝试发送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
}
Run Code Online (Sandbox Code Playgroud)
服务器:
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);
});
});
Run Code Online (Sandbox Code Playgroud)
看来这已经到了Poco的尽头,因为我可以从邮递员那里发送测试数据,而且报告还不错。我还在Poco上将KeepAlive设置为true,这似乎也被忽略了。有没有人足够使用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;
Run Code Online (Sandbox Code Playgroud)
另外,需要设置我之前尝试过的contentLength,但是由于内容类型未正确发送而无法正常工作。正确设置内容长度和类型后,服务器正确接收,没有任何故障。
| 归档时间: |
|
| 查看次数: |
2988 次 |
| 最近记录: |