C ++ и SOAP - PullRequest
       66

C ++ и SOAP

11 голосов
/ 05 сентября 2008

У меня есть приложение C ++, которое необходимо подключить к веб-приложению JAVA, есть ли для этого хорошие SOAP-пакеты с открытым исходным кодом или проще было бы просто свернуть мое собственное?

Ответы [ 6 ]

11 голосов
/ 05 сентября 2008

Я проголосую за темный шлем, так как gSoap также будет моей рекомендацией. Мы в основном магазин Java, но с некоторыми битами C ++ и gSoap был нашим предпочтительным способом интеграции SOAP. Это действительно больше работы, чем ваши обычные стеки Java, но это кажется надежным.

1 голос
/ 17 сентября 2008

Мы использовали gSOAP, а не Axis, чтобы избежать зависимости как от JRE, так и от Axis только для создания проекта C ++. Он работает нормально, что хорошо, так как код gSOAP ужасен и делает очень трудным исправление любых ошибок в нем.

Предупреждение о связывании gSOAP: вы никогда не можете использовать более одного WSDL в одном объекте ссылки (исполняемый файл, dll, общий объект). Это связано с тем, что некоторые из созданных специфичных для WSDL функций имеют общие имена (например, soap_getfault ()).

Хуже того, при связывании Unix ELF эти имена будут вызывать перекрестное связывание между общими объектами, поэтому ошибка FooService может быть обработана soap_getfault () для BarService, что приведет к повреждению памяти, если структуры детализации ошибок отличаются.

Обходной путь для этого - убедиться, что ничего, связанного с gSOAP, не открыто вне SO, с которым они связаны. Эту проблему можно решить, предоставив gcc следующие определения при подключении самой библиотеки gSOAP и связывании вашего кода:

#define SOAP_FMAC2  __attribute__ ((visibility ("hidden")))
#define SOAP_FMAC4  __attribute__ ((visibility ("hidden")))
#define SOAP_FMAC6  __attribute__ ((visibility ("hidden")))
#define SOAP_NMAC   __attribute__ ((visibility ("hidden")))

Я решил это, поместив их в заголовочный файл и заставив gcc включить это прежде всего с -include fixsoaplink.h.

Лучший способ, если вы можете предпринять усилия, - изменить видимость ELF по умолчанию на скрытую и экспортировать только те символы, которые вы хотите (например, dllimport / dllexport в VC).

1 голос
/ 05 сентября 2008

Быстрый Google обнаружил это для инструментария. Хотя я никогда не использовал его, он кажется довольно популярным и солидным. Не совсем пакет, и на самом деле не свой собственный, но как бы посередине.

0 голосов
/ 29 сентября 2008

Вот еще одна проблема с gSOAP, которую мы только что обнаружили трудным путем: он использует select () для всех опросов, поэтому, как только у вас откроется 1024 файловых дескриптора (64 в Windows?), Он очистит стек. Это приводит к ложным ошибкам, когда он не может отправлять сообщения, чтобы завершить сбои приложения.

Обходной путь, если вы не готовы к самому исправлению gSOAP, - это написать собственный сетевой код и подключить его с помощью soap-> fconnect, -> fsend, -> frecv и т. Д.

0 голосов
/ 18 сентября 2008

Когда я увидел сгенерированный код из gSOAP, у меня случился сердечный приступ.

Тот факт, что пользователь должен выполнять все функции управления памятью для каждого объекта, просто поразил меня. Итак, я сел и сделал что-то глупое в долгосрочной перспективе, но в краткосрочной перспективе вполне удовлетворительное ...

Я написал программу, которая упаковывает код gSOAP с моими собственными классами CPP, которые делают интерфейс более похожим на то, что я хотел бы, чтобы он выглядел.

Я использовал Scoped Guards в каждом сервисном методе для хранения памяти, и, поскольку я имею дело со всеми видами различных типов, я использовал std::list<boost::any> для этого. У меня есть функции, которые делают каждый тип объекта, который мне нужен, и они помещают фактическую память в мой list<any>. У него было несколько проблем - в основном только изменения конфигурации. Сейчас я создаю тысячи классов, общаюсь с десятками веб-сервисов.

Я не уверен, что рекомендую свой путь кому-либо еще ... Я, вероятно, должен прикусить пулю и начать пытаться внести свой вклад в gSOAP, а не поддерживать свой собственный инструмент, который зависит от вывода gSOAP. ..

0 голосов
/ 05 сентября 2008

Взгляните на проект Apache Axis . Он хорошо поддерживается на C ++ (и Java), и если вам повезет начать с хорошего WSDL для целевой службы, вы останетесь без дома.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...