Подключите приложение C++ к веб-приложению JAVA с помощью SOAP

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
11
0
3 779
6

Ответы 6

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

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

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

Мы выбрали 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).

Хм. На самом деле мне показалось, что я увидел в gSOAP кое-что интересное о размещении всего сгенерированного кода за пространством имен. На самом деле я почти уверен. Это означало бы, что функции с общим именем, такие как soap_getfault (), не будут конфликтовать даже в одном объекте ссылки.

Matt Cruikshank 18.09.2008 16:45

Фактически вы можете поместить более одного wsdl в один объект ссылки, в настоящее время я это делаю!

fido 05.04.2009 19:02

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

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

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

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

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

Я проделал то же самое, а затем понял, насколько это глупо и непосильно. После рефакторинга кода у меня появился шаблонный класс, который мог работать с любым сгенерированным классом gSOAP C++. Я могу отправить вам код, если хотите.

fido 05.04.2009 19:04

Я был бы признателен! - [email protected] или, может быть, вы могли бы опубликовать его в коде Google или что-то подобное. :-)

Matt Cruikshank 05.04.2009 22:34

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

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

Другие вопросы по теме