Как передать данные в Poco HTTPRequest - PullRequest
0 голосов
/ 11 мая 2018

Это касается моего проекта, где я пишу Poco SSL-клиент для связи с сервером.

Я могу сделать (i) Basic Auth (ii) Обмен сертификатами.Но после отправки почтового запроса я сталкиваюсь с «Ошибка 500».

Позвольте мне объяснить это =>

У меня есть рабочий локон:

curl -d '{"name":"com.my.session.value"}' -H 'Content-Type: application/json' -H 'Accept: application/json' -E MyCert.pem --key MyKey.pem -u testuser -k -vvv https://<server-ip>:<port>/Internal/directory/path

, используя это Явозможность печатать данные на консоли.Поэтому попытался написать то же самое в Poco / C ++:

// I have handler for keyPassparse, cert, invalid-cert-handler and used them in below line
SSLManager::instance().initializeClient(parse_str, Cert, ptrContext);

URI uri(argv[1]);
Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort());
session.setKeepAlive(true);
Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_POST, uri.getPath(), Poco::Net::HTTPMessage::HTTP_1_1);
HTTPBasicCredentials cred("testuser", "secret");

    //Here I tried to add headers and data

    cred.authenticate(req);
    req.add("Content-Type","application/json");
    req.add("Accept","application/json");
    req.add("data","com.my.session.value"); // try-1 to add data
    req.setKeepAlive(true);
    std::ostream& myOStream = session.sendRequest(req);
    std::string body("name=com.my.session.value"); // try-2 to add data
    myOStream << body;

    Poco::Net::HTTPResponse response;
    std::istream& rs = session.receiveResponse(response);
    std::cout << response.getStatus() << " " << response.getReason() << std::endl;
}
catch (Exception& exc)
{
    std::cerr << exc.displayText() << std::endl;
    return 1;
}

return 0;

}

Это всегда возвращает ошибку: 500 (внутренняя ошибка сервера), что означает, что мой раздел данных не достигает должным образом.

Пожалуйста, предложите мне способ передать правильный раздел "данных" на сервер.

Заранее спасибо.

1 Ответ

0 голосов
/ 12 мая 2018

Я нашел решение для этого:

1) Я отправил данные как json:

Poco::JSON::Object obj;
obj.set("name", "com.my.session.value");
std::stringstream ss; 
obj.stringify(ss);

2) Пастухи контента не должны добавляться с помощью «add», для них используется следующее:

req.setContentType("application/json");
req.setContentLength(ss.str().size());

3) Теперь отправляем тело так:

std::ostream& myOStream = session.sendRequest(req);
obj.stringify(myOStream);

Используемый подход: Я написал код для http. Посылал одинаковые данные curl и exe, перехватывал пакеты для обоих. Сравнивались и исправлялись пробелы один за другим.

Надеюсь, это поможет кому-то в будущем.

...