Метод PUT библиотеки Poco не работает должным образом, хотя хост, метод, тип содержимого установлены правильно - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующий код на C ++ с библиотекой Poco, который должен выполнять 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;

Предполагается, что PUT выполняется на локальном промежуточном программном обеспечении, выполненном в 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 голосов
/ 20 сентября 2018

Вы на самом деле не отправляете тело с 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;
...