Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > HTTPS + SOAP


Автор: cupper 30.5.2011, 10:50
Здравствуйте, нужно организовать работу по https + soap и сервисом.

В наличии имеет poco, xcerces, openssl.

Раньше не когда не работал на прямую с этими компонентами. Почитал, вроде как poco поддерживает работу по htpps благодяра openssl. Но те примеры которые я находил упирались в том что начальную сессия нужно инициализировать сертификатом с ресурса. 
Вопрос: обязательно иметь этот сертификат в наличии или можно как то переложить это на плечи библиотеки ?
Вопрос2: для работы конкретно с SOAP есть какие либо специальные компоненты, что бы не работать с ним как с голым xml. Есть ли такие компоненты в Poco (пока ненашел)? Так же нужно будет реализовывать проверку с xsd схемами.

Буду очень благодарен если кто то в терминах С++ опишет принцип работы с https и soap.

Автор: cupper 2.6.2011, 14:55
наконецтаки добрался до непосредственно реализации сесии. Печально что никто ничего так и не подсказал. 

Значит, делаю так. В начале инициализирую клиентскую сессию
Код

if(isFirst)
            {
                Poco::URI uri(properties_.sksServiceUri_);
                uri.setPort(properties_.sksServicePort_);
                tokenUri_ = uri;
            }

            tokenContext_.reset(new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE));
            tokenSession_.reset(new HTTPSClientSession(tokenUri_.getHost(), tokenUri_.getPort(), tokenContext_.get()));


context пока создаю на абум, так как еще не понял как там с сертификатами.
Первый опрометчивый облом: я думал что при создании сессии будет сразу производиться соединения, и на этом этапе можно будет реализовать реконнект. Увы нихрена ничего тут не происходит.

Далее пробую отправить сообщение, любой на абум.
Код

    HTTPRequest req_post(HTTPRequest::HTTP_POST, properties_.sksServiceUri_);
    try
    {

        req_post.setVersion(HTTPRequest::HTTP_1_1);
        req_post.setContentType("text/xml");
        req_post.setContentLength(msg.size());
        req_post.set("User-Agent","FIXEdge HTTPS Transport Client/v.2");
    }catch(...){//doit}
try
{
        tokenSession_->sendRequest(req_post) << msg;

        HTTPResponse res;

        std::istream& rs = tokenSession_->receiveResponse(res);

        int stat = res.getStatus();
        string rcReason = res.getReason();
        if (stat == 200)
...
}

в ответ через некоторое время получаю исключения с "превышено время ожидания".

Теперь собстно вопрос в том как правильно задать все параметры.

Автор: cupper 2.6.2011, 15:42
Если мне webService при обращении на определенный https урул выдает свой сертификат (в котором вро де как должны необходимые для меня данные быть) то как мне с Poco это реализовать ? Мне нужно самому этот сертификат скачать и подсунуть Poco, или же Poco его скачает и выдает мне ?

PS. Уху, сертификат вытаскиваю из сайт tokenSession_->serverCertificate();
PPS. Не понял что изменилось, но есть контакт smile сервер ответил ошибкой и сертификат получен. Завтра буду пробывать на все это наложить еще soap

Автор: jonie 5.6.2011, 13:54
вам проще использовать gSOAP - он из коробки умеет SSL

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)