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

C++ 未收到Poco::Net::HTTPClientSession json数据内容类型,c++,json,node.js,http,poco-libraries,C++,Json,Node.js,Http,Poco Libraries,因此,我正在开发一个服务器端Nodejs/expressjs应用程序和一个客户端c++/Poco应用程序。我已经设法在服务器所在的位置和客户端之间创建了一个会话。但是,每当我尝试发送JSON负载时,express.js都会将req.body显示为空 谷歌没有透露太多,除了内容类型可能没有被正确传输之外,它似乎是这样。我确实明确地设置了它,但显然我遗漏了一个步骤 客户端 void upload(std::list<std::string>& args) { if (ar

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

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

客户端

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
}

这似乎是在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;
HTTPClientSession会话(uri.getHost(),uri.getPort()); HTTPRequest请求(HTTPRequest::HTTP_POST,路径,HTTPMessage::HTTP_1_1); HTTPResponse响应; std::stringstream-ss; 对象字符串化(ss); request.setKeepAlive(true); request.setContentLength(ss.str().size()); request.setContentType(“application/json”);//明确设置内容类型正确吗? std::ostream&o=session.sendRequest(请求); 对象字符串化(o);//可以确认它吐出的是有效的
std::cout感谢您发布此问答-不明白为什么有人会不加评论就投反对票-对于Poco来说,没有这样的气馁的例子已经足够少了。但是最后一行怎么可能起作用?也就是说,
response
似乎没有连接到任何东西-是否缺少代码?哦,是的,实际上缺少了一些行。我为什么被否决了。看看gist,它展示了一个完整的例子。是的-我意识到需要一个
会话。receiveResponse()
调用。。。但是,
obj.stringify(ss)
仍然缺少一些东西-这些数据是如何进入请求的?这将是很好的编辑您的答案与充分测试solution@omatai-该要点包含了生产代码中正在使用的内容(省略了敏感内容)。stringstreams的目的只是获取将放入缓冲区的json内容的长度。stringify将json对象“obj”的内容粘贴到您设置内容长度的stringstream中。然后,当您稍后调用session.sendRequest(request)时,您将获得它将用于流式传输数据的实际ostream。对obj.stringify(o)的调用是数据如何在请求中结束的。我会在有时间的时候编辑我的答案。
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;