Poco::Net::HTTPClientSession json data Content-Type not rece



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

谷歌没有透露更多的内容,除了内容类型可能没有正确传输,它似乎是这样的。我确实显式地设置了它,但显然我遗漏了一个步骤。

客户端

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);
    });
});

看起来这是在Poco端,因为我可以从postman传输测试数据并且它报告得很好。我还在Poco上将keepalive设置为true,这似乎也被忽略了。有人充分利用了Poco吗?

对有状态流通信风格感到有点困惑。它是http,从技术上讲仍然是一个无状态连接。除了BODY之外,所有关于请求的信息都必须在发送初始请求之前完成。

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;

还需要设置我之前尝试过的内容长度,但由于内容类型没有正确发送而无法工作。设置好内容长度和类型后,服务器可以正常接收。

相关内容

最新更新