GSOAP - gSOAP
Разработчики) | Роберт ван Энгелен |
---|---|
изначальный выпуск | 8 декабря 2000 г. |
Стабильный выпуск | 2.8.107 / 6 октября 2020 г. |
Репозиторий | |
Написано в | C и C ++ |
Операционная система | Кроссплатформенность |
Тип | ПО для веб-разработки |
Лицензия | GPL v2, коммерческое лицензирование |
Интернет сайт | https://www.genivia.com/dev.html https://sourceforge.net/projects/gsoap2/ |
gSOAP[1][2] это набор инструментов для разработки программного обеспечения на C и C ++ для МЫЛО /XML веб-сервисы и общий Привязки данных XML. Учитывая набор объявлений типов C / C ++, инструменты gSOAP на основе компилятора генерируют процедуры сериализации в исходном коде для эффективного XML. сериализация указанных структур данных C и C ++. Сериализация занимает нулевая копия накладные расходы.
История
Инструментарий gSOAP начался как исследовательский проект в Университет штата Флорида профессором Робертом ван Энгеленом в 1999 году. В рамках проекта были внедрены новые методы[2] для высокоэффективного парсинга XML (парсинг по запросу)[3][4] и сериализация данных C / C ++ непосредственно в XML а позже и в МЫЛО. Проект удался[5] при определении типобезопасный привязки данных между Схема XML типы и широкий выбор Типы данных C / C ++. Инструментарий использует автоматическое программирование для упрощения разработки и вызова веб-служб с помощью эффективных автоматически сгенерированных сериализаторов XML для прямой отправки и получения данных C / C ++. Инструмент на основе компилятора для конкретной предметной области генерирует исходный код, который эффективно преобразует собственные структуры данных C / C ++ в XML и обратно.[1] Инструментарий был доработан для поддержки протокола обмена сообщениями веб-служб SOAP, представленного примерно в то же время, поэтому название "gSOAP" (граммэнергичный XML и МЫЛО) и использовать подход для обмена научными данными.[6] Дальнейшая разработка и обслуживание программного обеспечения проходили под управлением Genivia Inc., включая добавление новых WSDL и Схема XML возможности обработки, а также добавление многих возможностей протокола веб-служб WS- *, таких как оптимизация WS-Security,[7] XML-RPC обмен сообщениями, поддержка JSON формат данных, подключаемые модули для интеграции gSOAP в веб-серверы Apache и IIS, а также подключаемые модули сторонних производителей, такие как Grid Services.[8][9] Инструментарий gSOAP написан на переносимом C / C ++ и использует форму самонастройка путем создания собственного кода для реализации преобразователя для преобразования спецификаций WSDL / XSD в исходный код C / C ++ для привязок метаданных WSDL / XSD. Программное обеспечение gSOAP находится под лицензией GPLv2 с открытым исходным кодом и лицензиями на коммерческое использование исходного кода. Программное обеспечение gSOAP широко используется в промышленных проектах.[10] и критически важные инфраструктуры.
Пример работы XML-веб-службы
Пример операции веб-службы на языке C для получения стоимости проживания в отеле с учетом количества гостей может быть объявлен в аннотированной форме как
// пространство имен службы gsoap ns: tempuri// стиль службы gsoap ns: документ// кодировка службы gsoap ns: литералint ns__get_rate(char* Гостиница, int гости, плавать *ставка);
Последним параметром функции всегда является возвращаемое значение службы, которое может быть обозначено как недействительное для односторонних операций и должно быть структурой / классом для объединения нескольких возвращаемых параметров службы. Возвращаемое значение функции int используется для диагностики ошибок.
Вызов службы в C с использованием автоматически созданной функции soap_call_ns__get_rate выполняется следующим образом:
const char *URL = "http://www.example.com/hotels";const char *действие = НОЛЬ;структура мыло *ctx = soap_new(); // новый контекстплавать ставка;int ошибаться = soap_call_ns__get_rate(ctx, URL, действие, «Хэппи Инн», 2, &ставка);если (ошибаться == SOAP_OK && ставка < 100.00) погнали();soap_end(ctx); // освобождаем десериализованные данныемыло бесплатно(ctx); // освобождаем контекст
Чтобы упростить реализацию веб-сервисов для устаревших систем C и C ++, префиксная квалификация имен идентификаторов в C / C ++ может быть опущена или может быть заменена записью двоеточия, например, ns: get_rate, а не ns__get_rate. Знаки пунктуации удаляются в автоматически созданном исходном коде, который используется в сборках проекта.
Вызов службы в C ++ с использованием автоматически сгенерированного класса Proxy выполняется следующим образом (с использованием URL-адреса конечной точки по умолчанию и значений действия SOAP):
Прокси доверенное лицо;плавать ставка;int ошибаться = доверенное лицо.get_rate(«Хэппи Инн», 2, &ставка);если (ошибаться == SOAP_OK && ставка < 100.00) погнали();доверенное лицо.разрушать(); // освобождаем десериализованные данные
За счет использования аннотаций и соглашений об именах идентификаторов, то есть квалификации с префиксом ns__ для функции ns__get_rate и объявления свойств пространства имен ns с помощью директив // gsoap в этом примере, устанавливается привязка к операциям веб-службы. В автоматически сгенерированном документе языка описания веб-служб (WSDL) объявляются сообщение запроса, ответное сообщение, интерфейс portType и привязка SOAP для функции ns__get_rate следующим образом:
<определения имя ="Служба" targetNamespace ="темпури" xmlns: tns ="темпури" xmlns: ns ="темпури" xmlns ="http://schemas.xmlsoap.org/wsdl/">...<сообщение имя ="get-rateRequest"> <часть имя ="параметры" element ="ns: get-rate"/></message><сообщение имя ="get-rateResponse"> <часть имя ="параметры" element ="ns: get-rateResponse"/></message> имя ="ServicePortType"> <операция имя ="получить-ставку"> <ввод сообщение ="tns: get-rateRequest"/> <вывод сообщение ="tns: get-rateResponse"/> </operation></portType><привязка имя ="Служба" type ="tns: ServicePortType"> style ="документ" транспорт ="http://schemas.xmlsoap.org/soap/http"/> <операция имя ="получить-ставку"> soapAction =""/> <input> части ="параметры" использовать ="буквальный"/> </input> <output> части ="параметры" использовать ="буквальный"/> </output> </operation></binding>
где сообщения запроса и ответов операции относятся к элементам XML, которые определены в разделе типов WSDL следующим образом:
<types> <схема targetNamespace ="темпури" ...> <элемент имя ="получить-ставку"> <complexType> <sequence> <элемент имя ="Гостиница" type ="xsd: строка" minOccurs ="0" maxOccurs ="1" nillable ="истинный"/> <элемент имя ="гости" type ="xsd: int" minOccurs ="1" maxOccurs ="1"/> </sequence> </complexType> </element> <элемент имя ="get-rateResponse"> <complexType> <sequence> <элемент имя ="ставка" type ="xsd: float" minOccurs ="0" maxOccurs ="1" nillable ="истинный"/> </sequence> </complexType> </element> </schema></types>
Точно так же исходный код C / C ++ клиента и сервера может быть автоматически сгенерирован из набора WSDL и XML-схем. Услуги должны быть завершены путем определения соответствующих операций службы. Например, автоматически сгенерированный класс обслуживания C ++ для этого WSDL должен быть завершен путем определения метода get_rate следующим образом:
int Служба::get_rate(char *Гостиница, int гости, плавать *ставка){ *ставка = ... // определение стоимости проживания в отеле с учетом количества гостей возвращаться SOAP_OK;}
Нет никаких ограничений на тип параметров операции, которые могут быть маршалированы в XML для обмена сообщениями веб-службы, за исключением того, что для установления привязки данных следует соблюдать определенные соглашения и аннотации объявления типов.
Привязка данных XML на примере
Чтобы установить привязку данных XML с типами данных C / C ++, gSOAP использует три основных формы аннотации исходного кода: директивы, соглашения об именах идентификаторов и знаки препинания.
Объявление полностью аннотированной структуры в C для иерархической записи о сотруднике может выглядеть как
// пространство имен схемы gsoap ns: tempuri// форма схемы gsoap ns: квалифицированнаяструктура ns__employee_record{ @char *xml__lang = "en"; @int Я БЫ = 9999; char *полное имя 1:1; $ int размер 0:12; структура ns__employee_record *управляет;};
где используются следующие аннотации и соглашения:
- квалификация пространства имен типов и членов по соглашениям об именах идентификаторов: ns__employee_record, xml__lang
- атрибуты для членов: @ char *, @int
- значения по умолчанию для членов: xml__lang = "en", ID = 9999
- ограничения появления в виде minOccurs:maxOccurs для проверки XML: полное_имя 1: 1, размер 0:12
- динамические массивы последовательностей элементов состоят из пары поля специального размера и члена указателя массива: $ int size; struct ns__employee_record * управляет
Инструменты gSOAP преобразуют типы данных C / C ++ в типы данных схемы XML и обратно. Поскольку C не поддерживает пространства имен, а имена членов структур / классов не могут быть квалифицированы пространством имен в C ++, использование соглашений об именах идентификаторов в gSOAP позволяет привязать эту структуру и ее элементы к XML-схеме complexType, которая автоматически создается следующим образом:
<схема targetNamespace ="темпури" xmlns: ns ="темпури" xmlns: xsd ="http://www.w3.org/2001/XMLSchema" xmlns ="http://www.w3.org/2001/XMLSchema" elementFormDefault ="квалифицированный" attributeFormDefault ="квалифицированный"> имя ="сотрудник-запись"> <sequence> <элемент имя ="полное имя" type ="xsd: строка" minOccurs ="1" maxOccurs ="1" nillable ="истинный"/> <элемент имя ="управляет" type ="нс: запись сотрудника" minOccurs ="0" maxOccurs ="12"/> </sequence> <атрибут ref ="xml: lang" использовать ="дефолт" по умолчанию ="en"/> <атрибут имя ="Я БЫ" type ="xsd: int" использовать ="дефолт" по умолчанию ="9999"/> </complexType></schema>
Кроме того, объединения в структуре / классе, которые аннотируются специальным полем селектора для выбора члена объединения, отображаются в / из частиц выбора схемы, контейнеры STL отображаются в / из частиц последовательности, перечисления отображаются в / из перечислений XML-схемы simpleType, и стандартные примитивные типы C / C ++ отображаются в / из типов XSD. Для преобразования схемы XSD в типы данных C / C ++ фактическое сопоставление можно настроить в gSOAP с помощью файла сопоставления типов.
Экземпляр примерной иерархической структуры сотрудников по умолчанию сериализуется в XML в виде дерева, например
<нс: сотрудник xmlns: ns ="темпури" xml: lang ="en" нс: ID ="12"> <ns:full-name>Джейн Доу</ns:full-name> <нс: управляет xml: lang ="en" нс: ID ="34"> <ns:full-name>Джон Доу</ns:full-name> </ns:manages> <нс: управляет xml: lang ="en" нс: ID ="56"> <ns:full-name>Боб Оз</ns:full-name> <нс: управляет xml: lang ="en" нс: ID ="78"> <ns:full-name>Алиса Оз</ns:full-name> </ns:manages> </ns:manages></ns:employee>
Когда включен стиль кодирования SOAP, сериализация XML в gSOAP учитывает объекты со ссылками и циклические структуры данных в соответствии с правилами кодирования SOAP, в результате чего XML с id-ref края.
Привязка автоматически сгенерированных данных XML включает операции чтения и записи в / из файла, строки или потока. Например, объект ns__employee_record имеет операции чтения и записи:
int soap_read_ns__employee_record(структура мыло*, ns__employee_record*);int soap_write_ns__employee_record(структура мыло*, const ns__employee_record*);
Чтобы прочитать запись сотрудника из файла XML:
структура мыло *ctx = soap_new();ctx->recvfd = открыто("employee.xml", O_RDONLY);если (ctx->recvfd){ ns__employee_record наемный рабочий; если (soap_read_ns__employee_record(ctx, &наемный рабочий) == SOAP_OK) ... Закрыть(ctx->recvfd);}soap_end(ctx);soap_destroy(ctx); // также удаляет данные сотрудниковмыло бесплатно(ctx);
Анализируемый XML внутренне проверяется на соответствие ограничениям привязки данных.
XML REST API
Данные приложения можно отправлять и получать в / из службы REST XML. Связывание данных XML обеспечивает вызовы REST XML API. Например, учитывая привязку данных XML ns__employee_record из предыдущего раздела, автоматически создаются следующие операции GET, PUT и POST:
int soap_GET_ns__employee_record(структура мыло*, const char *URL, ns__employee_record*);int soap_PUT_ns__employee_record(структура мыло*, const char *URL, const ns__employee_record*);int soap_POST_send_ns__employee_record(структура мыло*, const char *URL, const ns__employee_record*);int мыло_POST_recv_ns__employee_record(структура мыло*, ns__employee_record*);
Функции POST должны вызываться вместе, сначала POST_send для передачи данных XML на URL-адрес конечной точки, а затем POST_recv для приема данных ответа (может быть другого типа).
Полученный XML внутренне проверяется на соответствие ограничениям привязки данных.
Функции
- Связывание данных XML для C и C ++ на основе автоматическое программирование с генерацией исходного кода
- Настраиваемая автоматическая генерация исходного кода клиент / сервер в ANSI C и ISO C ++
- Интегрированный высокоскоростной, зависящий от схемы XML pull parsing с Проверка XML
- Язык описания веб-сервисов (WSDL) 1.1 и 2.0
- Веб-сервисы МЫЛО 1.1 и 1.2
- Потоковое Механизм оптимизации передачи сообщений (MTOM) и вложения DIME / MIME
- Изобразительное State Transfer (ОТДЫХ) HTTP (S) 1.0 / 1.1
- Проверено Базовый профиль WS-I 1.0a, 1.1 и 1.2 совместимы
- Проверено Шаблоны схемы W3C для привязки данных, полное покрытие тестовой таблицы
- XML-RPC для C и C ++
- JSON для C и C ++
- RSS 0.91, 0.92, 2.0
- WS-Безопасность
- WS-Политика 1.2, 1.5 и WS-SecurityPolicy 1.2
- WS-адресация 2003/03, 2004/03, 2005/03
- WS-ReliableMessaging 1.0 и 1.1
- WS-Discovery 1.0/1.1
- SOAP-поверх-UDP
- Обнаружение и интеграция универсального описания (UDDI) v2 API
- Базовая и дайджест-аутентификация HTTP, аутентификация NTLM, аутентификация прокси
- IPv4 и IPv6 с SSL / TLS с кэшированием сеанса SSL (на основе OpenSSL или же GNUTLS )
- Сжатие XML с помощью gzip
- Модули Apache 1.x и 2.0, IIS ISAPI и WinInet модули, CGI и FastCGI
- Поддержка автономного веб-сервера (многопоточность, пул)
- Интегрированное управление памятью с освобождением и обнаружением утечек
- Архитектура с плагинами для дополнительных возможностей
- Поддержка интернационализации / локализации (кодировки UTF8, UCS4, MB и т. Д.)
- Не зависит от платформы, поддерживает небольшие устройства (Symbian, VxWorks, Android, iPhone)
Рекомендации
- ^ а б ван Энгелен, Роберт (2008). «Структура для сервис-ориентированных вычислений с компонентами веб-сервисов C и C ++». ACM-транзакции по интернет-технологиям. 8 (3): 106–115. Дои:10.1145/1361186.1361188.
- ^ а б ван Энгелен, Роберт; Галливан, Кайл (2002). Набор инструментов gSOAP для веб-служб и одноранговых вычислительных сетей. Международный симпозиум IEEE по кластерным вычислениям и сетям. С. 128–135.
- ^ Голова, Майкл; Говиндераджу, Мадху; Сломинский, Александр; Лю, Пу; Абу-Газале, Найеф; ван Энгелен, Роберт; Чиу, Кеннет (2005). Тестирование процессоров XML для приложений в Grid Web Services. IEEE / ACM Supercomputing (SC).
- ^ Голова, Майкл; Говиндераджу, Мадху; ван Энгелен, Роберт; Чжан, Вэй (2006). Тестирование процессоров XML для приложений в Grid Web Services. IEEE / ACM Supercomputing (SC).
- ^ ван Энгелен, Роберт; Говиндараджу, Мадху; Чжан, Вэй (2006). Изучение согласованности удаленных объектов в веб-службах XML. Международная конференция по веб-сервисам (ICWS). С. 249–256.
- ^ ван Энгелен, Роберт (2003). Расширяя границы SOAP с помощью веб-сервисов для научных вычислений. Конференция по веб-сервисам (ICWS). С. 346–354.
- ^ Роберт, ван Энгелен; Чжан, Вэй (2008). Обзор и оценка оптимизации производительности безопасности веб-служб. Международная конференция IEEE по веб-сервисам (ICWS). С. 137–144.
- ^ Алоизио, Джованни; Кафаро, Массимо; Эпикоко, Итало; Лецци, Даниэле; ван Энгелен, Роберт (2005). Подключаемый модуль GSI для gSOAP: повышенная безопасность, производительность и надежность. Международная конференция по информационным технологиям (ITCC). С. 304–309.
- ^ Кафаро, Массимо; Лецци, Даниэле; Фиоре, Сандро; Алоизио, Джованни; ван Энгелен, Роберт (2007). Подключаемый модуль GSI для gSOAP: создание межсетевых взаимодействующих безопасных сетевых сервисов. Международная конференция по параллельной обработке и прикладной математике (PPAM) 2007, семинар по моделям, алгоритмам и методологиям для вычислительной среды с поддержкой грид (MAMGCE), Springer Verlag LNCS Volume 4967. pp. 894–901.
- ^ Челленер, Дэвид; Йодер, Кент; Катерман, Райан; Саффорд, Дэвид; Ван Дорн, Леендерт (2007). Практическое руководство по надежным вычислениям. Pearson Education.