POCO, как отправлять XML-данные?

В моем проекте я столкнулся с серьезной проблемой, когда программа не может получить данные, а затем вылетает. это мой код:

HTTPClientSession s("x.x.x.x",8000);
HTTPRequest request(HTTPRequest::HTTP_POST);
std::ostream& send = s.sendRequest(request);
std::string body = "<a> xml </a>";
request.setContentLength( body.length() );
send << body <<std::flush;
HTTPResponse response;
std::istream& res = s.receiveResponse(response);
StreamCopier::copyStream(res, std::cout);

После того, как я запустил его, когда моя программа получила данные с сервера, она разбилась и выбросила

Poco::Net::messageException

.О мой Бог! Я проследил его во внутреннем коде POCO и обнаружил:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

мое свойство отправки данных в VS2005. В то же время Poco находит последнюю букву <!DOCTYPE как E, которая не является пробелом, поэтому выдает исключение. Кто-нибудь расследует дело? кто может мне помочь? Большое спасибо!!!!


person mac.ma    schedule 30.05.2012    source источник


Ответы (1)


Я отправляю данные почти так же. В моем коде есть только одно отличие.

request.setContentType("text/xml; charset=utf-8");

Согласно исходному коду библиотеки Poco, исключение «Poco::Net::MessageException» возникает из-за искаженного ответа от http-сервера.

person Denis Novikov    schedule 30.05.2012
comment
Я добавляю эти коды в свой проект, но ничего не происходит. @Denis Novikov - person mac.ma; 30.05.2012
comment
, вы можете дать мне образец, чтобы представить, что вы думаете, спасибо! - person mac.ma; 30.05.2012
comment
Когда я пробую ваш код с google.com (ip=173.194.32.164), я не получаю никаких исключений. То же самое происходит, когда я пытаюсь использовать сервер, написанный мной с помощью Poco::Net::HTTPServerSession. Но некоторые серверы не возвращают HTTP-заголовок в ответ. И это причина MessageException. - person Denis Novikov; 30.05.2012
comment
Вы можете заменить строки HTTPResponse response; std::istream& res = s.receiveResponse(response); кодом: Poco::Net::HTTPInputStream res(s); И Вы увидите полный ответ (включая заголовки) от сервера. Вам нужно #include <Poco/Net/HTTPStream.h> в свой источник. - person Denis Novikov; 30.05.2012
comment
Как вы только что сказали, сервер POCO, разработанный мной, дает мне заголовок HTTP/1.1 200 OK. С другой стороны, сервер, который вызывает проблему, дает мне ‹!DOCTYPE HTML PUBLIC --//IETF//DTD HTML 2.0 //RU› .Тогда есть ли способ решить эту проблему? - person mac.ma; 30.05.2012
comment
Сервер, который выдает вам сообщение ‹!DOCTYPE ...›, работает некорректно. В первой строке ответа он должен вернуть строку состояния (т. е. HTTP/1.1 200 OK). Если вы хотите работать с сообщениями, которые не содержат строку состояния и заголовки, вам следует самостоятельно проанализировать ответ (например, использовать HTTPInputStream). - person Denis Novikov; 30.05.2012
comment
Затем, используя HTTPInputStream, чтобы получить много std::string, как я могу получить их из потока? То, что я думаю, std::list, но не работает. - person mac.ma; 31.05.2012
comment
, Большое спасибо, вы лучшие. У меня есть другой вопрос, как я могу собрать OpenSSL с POCO? Теперь я хочу использовать HTTPSClientSession, но не OpenSSL. Можете ли вы дать мне ссылку ?? - person mac.ma; 31.05.2012
comment
Чтобы разделить istream на strings, вы можете использовать метод getline. - person Denis Novikov; 31.05.2012
comment
Я еще не работал с HTTPS. Вот почему я не могу ответить на ваш вопрос об OpenSSL. - person Denis Novikov; 31.05.2012
comment
, После того, как я отправил данные на сервер, использование session.receiveResponse(response) является жестким кодом для получения. Я хочу использовать для этого функцию callback. Например, сервер отправляет ответ клиенту, а затем автоматически вызывает callback. Как я могу это сделать? образец в POCO не завершил его так, как я хочу. - person mac.ma; 06.06.2012
comment
Я не вижу никакой обработки обратного вызова в документации для класса HTTPClientSession. Я думаю, вам следует реализовать callback самостоятельно. (т.е. создать новый класс, который объединяет HTTPClientSession). - person Denis Novikov; 06.06.2012
comment
ты отличный помощник! @ Денис Новиков. Как ты сказал, я должен использовать HTTPCliensSession::receiveResponse для получения данных ?? В Qt я могу использовать Signal&Slot mechanism для их получения, что мне легко понять, но POCO - нет. - person mac.ma; 06.06.2012
comment
, у меня другой вопрос. У меня вопрос, что HTTPCliensSession::receiveResponse вызывается программистом в synchronous, но сама выполняется в режиме asynchronous. Вы так думаете? - person mac.ma; 06.06.2012
comment
Да, вы делаете! Вы должны использовать receiveResponse. - person Denis Novikov; 06.06.2012
comment
Я думаю, вы правы насчет режима synchronous и asynchronous. - person Denis Novikov; 06.06.2012
comment
, я столкнулся с исключением под названием SSL Exception, что мне делать? msg = "error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol" .Вы видели? - person mac.ma; 07.06.2012