gpt4 book ai didi

c++ - 未收到 Poco::Net::HTTPClientSession json 数据内容类型

转载 作者:太空狗 更新时间:2023-10-29 20:56:36 31 4
gpt4 key购买 nike

所以我正在开发一个服务器端 Nodejs/expressjs 应用程序和一个客户端 c++/Poco 应用程序。我设法在托管服务器的位置和客户端之间创建了一个 session 。但是,每当我尝试发送我的 JSON 负载时,express.js 都会将 req.body 显示为空。

除了 Content-Type 可能没有正确传输并且看起来确实如此之外,Google 没有透露太多信息。我确实明确地设置了它,但显然我错过了一步。

客户端

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,技术上仍然是无状态连接。除正文外,有关请求的所有信息都必须在您发送初始请求之前完成。

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。内容长度和类型设置正确后,服务器顺利接收正确。

关于c++ - 未收到 Poco::Net::HTTPClientSession json 数据内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33327647/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com