尽管正确设置了主机,方法和内容类型,但Poco库的PUT方法无法按预期工作

时间:2018-09-20 16:02:22

标签: c++ node.js rest poco-libraries

我在带有Poco库的C ++中具有以下代码,该代码应在具有{"name" : "sensorXXX", "totalLots" : 50, "occupied": 5}之类的主体的localhost上执行PUT

string url = String("http://localhost:3000/cam1111");
URI uri(url);
HTTPClientSession session(uri.getHost(), uri.getPort());

// prepare path
string path(uri.getPathAndQuery());
if (path.empty()) path = "/";

// send request
HTTPRequest req(HTTPRequest::HTTP_PUT, path, HTTPMessage::HTTP_1_1);
req.setContentType("application/json");

string body = string("{\"name\" : \"Parking Sensor developed by aromanino\", \"totalLots\" : 50, \"occupied\": 5}");
// Set the request body
req.setContentLength( body.length() );

// sends request, returns open stream
std::ostream& os = session.sendRequest(req);
cout<<"request sent to " <<uri.getHost()<<endl;
cout<<"port "<<uri.getPort()<<endl;
cout<<"path "<<uri.getPathAndQuery()<<endl;
cout<<"body:\n"<<body<<endl;

HTTPResponse res;
cout << res.getStatus() << " " << res.getReason() << endl;

return 0;

应该将其放在NodeExpress中完成的本地中间件上。

我得到200作为答复,所以应该没问题。

但是中间件正在接收某些信息(因此主机和端口是正确的),但是它没有执行我期望的终点:

router.put("/:dev", function(req, res){
    //console.log(req.params.dev);
    /*Check if request contains total and occupied in the body: If not reject the request.*/
    var stat;
    var body_resp = {"status" : "", "message" : ""};;
    console.log(req.body);
    ....
});

它也未被router.all('*', ...)捕获。

同一主机,正文,内容类型在邮递员上按预期工作。

我应该在Poco库中设置更多内容以执行正确的PUT请求。

1 个答案:

答案 0 :(得分:1)

您实际上并没有发送带有HTTP请求的正文,如:

std::ostream& os = session.sendRequest(req);
os << body;

此外,在发送带有正文的请求之后,您还必须接收服务器响应-仅仅声明HTTPResponse对象是不够的。

HTTPResponse res;
std::istream& is = session.receiveResponse(res);

因此,完整的代码段应为:

string url = string("http://localhost:3000/cam1111");
URI uri(url);

HTTPClientSession session(uri.getHost(), uri.getPort());

string path(uri.getPathAndQuery());
if (path.empty()) path = "/";

HTTPRequest req(HTTPRequest::HTTP_PUT, path, HTTPMessage::HTTP_1_1);
req.setContentType("application/json");

string body = string("{\"name\" : \"Parking Sensor developed by aromanino\", \"totalLots\" : 50, \"occupied\": 5}");
req.setContentLength(body.length());

std::ostream& os = session.sendRequest(req);
os << body;

HTTPResponse res;
std::istream& is = session.receiveResponse(res);
cout << res.getStatus() << " " << res.getReason() << endl;