Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确



我在Poco库C++有以下代码,它应该在本地主机上执行PUT,其主体类似于{"name" : "sensorXXX", "totalLots" : 50, "occupied": 5}

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('*', ...)捕获.

相同的主机、正文、内容类型在 Postman 上按预期工作。

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

您实际上并没有使用 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;

相关内容

最新更新