Разработчики) | Роберт ван Энгелен |
---|---|
изначальный выпуск | 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 ++ для веб-служб SOAP / XML и общих привязок данных XML . Учитывая набор объявлений типов C / C ++, инструменты gSOAP на основе компилятора генерируют процедуры сериализации в исходном коде для эффективной сериализации XML указанных структур данных C и C ++. Сериализация требует лишних затрат на копирование .
История [ править ]
Инструментарий gSOAP начался как исследовательский проект в Университете штата Флорида профессором Робертом ван Энгеленом в 1999 году. В рамках проекта были представлены новые методы [2] для высокоэффективного синтаксического анализа XML (анализ методом pull) [3] [4] и сериализации C / Данные C ++ непосредственно в XML, а затем и в SOAP . Проекту удалось [5] определить безопасные для типов привязки данных между типами схем XML и широким спектром типов данных C / C ++ . Инструментарий использует автоматическое программирование.для упрощения разработки и вызова веб-служб с помощью эффективных автоматически сгенерированных сериализаторов XML для прямой отправки и получения данных C / C ++. Инструмент на основе компилятора для конкретной предметной области генерирует исходный код, который эффективно преобразует собственные структуры данных C / C ++ в XML и обратно. [1] Набор инструментов был доработан для поддержки протокола обмена сообщениями веб-служб SOAP, представленного примерно в то же время, отсюда и название « gSOAP » ( g eneric XML и SOAP ), а также для использования этого подхода к обмену научными данными. [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 нс служба имен: tempuri // gsoap нс стиль службы: документ // gsoap нс служба кодирование: буквальный INT ns__get_rate ( символ * отель , ИНТ гостей , поплавок * ставка );
Последним параметром функции всегда является возвращаемое значение службы, которое может быть обозначено как недействительное для односторонних операций и должно быть структурой / классом для объединения нескольких возвращаемых параметров службы. Возвращаемое значение функции int используется для диагностики ошибок.
Вызов службы в C с использованием автоматически созданной функции soap_call_ns__get_rate выполняется следующим образом:
const char * URL = "http://www.example.com/hotels" ; const char * action = NULL ; структура мыла * ctx = soap_new (); // новый контекст float rate ; int err = soap_call_ns__get_rate ( ctx , URL , действие , «Happy Inn» , 2 , & рейтинг ); if ( err == SOAP_OK && rate < 100.00 ) Let_go (); мыло-конец ( ctx ); // освобождаем десериализованные данные soap_free ( ctx ); // освобождаем контекст
Чтобы упростить реализацию веб-сервисов для устаревших систем C и C ++, префиксную квалификацию имен идентификаторов в C / C ++ можно опустить или заменить двоеточием, например, ns: get_rate, а не ns__get_rate. Знаки препинания удаляются в автоматически сгенерированном исходном коде, который используется в сборках проекта.
Вызов службы в C ++ с использованием автоматически сгенерированного класса Proxy выполняется следующим образом (с использованием URL-адреса конечной точки Proxy по умолчанию и значений действия SOAP):
Прокси- прокси ; курс плавания ; int err = прокси . get_rate ( "Happy Inn" , 2 , & скорость ); если ( err == SOAP_OK && rate < 100.00 ) Let_go (); прокси . уничтожить (); // освобождаем десериализованные данные
За счет использования аннотаций и соглашений об именах идентификаторов, т. Е. Квалификации с префиксом ns__ для функции ns__get_rate и объявления свойств пространства имен ns с помощью директив // gsoap в этом примере, устанавливается привязка к операциям веб-службы. В автоматически сгенерированном документе языка описания веб-служб (WSDL) объявляются сообщение запроса, ответное сообщение, а также интерфейс portType операции get-rate и привязка SOAP для функции ns__get_rate следующим образом:
<definitions name = "Service" targetNamespace = "tempuri" xmlns: tns = "tempuri" xmlns: ns = "tempuri" xmlns = "http://schemas.xmlsoap.org/wsdl/" >...<message name = "get-rateRequest" > <part name = "parameters" element = "ns: get-rate" /> </message> <message name = "get-rateResponse" > <part name = "parameters" элемент = "ns: get-rateResponse" /> </message><portType name = "ServicePortType" > <operation name = "get-rate" > <input message = "tns: get-rateRequest" /> <output message = "tns: get-rateResponse" /> </operation> </ portType><binding name = "Service" type = "tns: ServicePortType" > <SOAP: binding style = "document" transport = "http://schemas.xmlsoap.org/soap/http" /> <operation name = "get- rate " > <SOAP: operation soapAction = " " /> <input> <SOAP: body parts = " parameters " use = " literal " /> </input> <output> <SOAP: body parts = " parameters " use = "буквальный" /> </output> </operation> </binding>
где сообщения запроса и ответов операции относятся к элементам XML, которые определены в разделе типов WSDL следующим образом:
<types> <schema targetNamespace = "tempuri" ... > <element name = "get-rate" > <complexType> <sequence> <element name = "hotel" type = "xsd: string" minOccurs = "0" maxOccurs = "1" nillable = "true" /> <element name = " guest " type = "xsd: int" minOccurs = "1" maxOccurs = "1" /> </sequence> </complexType> </ element> <element name = "get-rateResponse" > <complexType> <sequence> <element name = "rate" type = "xsd: float" minOccurs = "0" maxOccurs = "1" nillable = "true" /> </sequence> </complexType> </element> </schema> </types>
Точно так же исходный код C / C ++ клиента и сервера может быть автоматически сгенерирован из набора WSDL и XML-схем. Услуги должны быть завершены путем определения соответствующих операций службы. Например, автоматически сгенерированный класс обслуживания C ++ для этого WSDL должен быть завершен путем определения метода get_rate следующим образом:
INT Service :: get_rate ( символ * отель , ИНТ гости , поплавок * скорость ) { * ставка = ... // определить скорость полегания отеля , учитывая количество гостей вернуться SOAP_OK ; }
Нет никаких ограничений на тип параметров операции, которые могут быть маршалированы в XML для обмена сообщениями веб-службы, за исключением того, что для установления привязки данных необходимо соблюдать определенные соглашения и аннотации объявления типов.
Привязка данных XML на примере [ править ]
Чтобы установить привязку данных XML с типами данных C / C ++, gSOAP использует три основных формы аннотации исходного кода: директивы, соглашения об именах идентификаторов и знаки препинания.
Объявление полностью аннотированной структуры в C для иерархической записи о сотруднике может выглядеть как
// пространство имен схемы gsoap ns: tempuri // форма схемы gsoap ns: квалифицированная структура ns__employee_record { @ char * xml__lang = "en" ; @ int ID = 9999 ; символ * полное_имя 1 : 1 ; $ int size 0 : 12 ; struct 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, которая автоматически создается следующим образом:
<schema targetNamespace = "tempuri" xmlns: ns = "tempuri" xmlns: xsd = "http://www.w3.org/2001/XMLSchema" xmlns = "http://www.w3.org/2001/XMLSchema" elementFormDefault = "квалифицированный" attributeFormDefault = "квалифицированный" > <complexType name = "employee-record" > <sequence> <element name = "full-name" type = "xsd: string" minOccurs = "1" maxOccurs = "1" nillable = "true" /> <element name = "manages" type = "ns: employee-record" minOccurs = "0" maxOccurs = "12" /> </sequence> <attribute ref = "xml: lang" use = "default" default = "en" /> <attribute name = "ID" type = "xsd: int" use ="default" default = "9999" /> </complexType></schema>
Кроме того, объединения в структуре / классе, которые аннотируются специальным полем селектора для выбора члена объединения, отображаются в / из частиц выбора схемы, контейнеры STL отображаются в / из частиц последовательности, перечисления отображаются в / из перечислений простого типа схемы XML, и стандартные примитивные типы C / C ++ отображаются в / из типов XSD. Для преобразования схемы XSD в типы данных C / C ++ фактическое сопоставление настраивается в gSOAP с помощью файла сопоставления типов.
Экземпляр примерной иерархической структуры сотрудников по умолчанию сериализуется в XML в виде дерева, например
<ns: employee xmlns: ns = "tempuri" xml: lang = "en" ns: ID = "12" > <ns: full-name> Джейн Доу </ ns: full-name> <ns: управляет xml: lang = "ru" ns: ID = "34" > <ns: full-name> Джон Доу </ ns: full-name> </ ns: manages> <ns: manages xml: lang = "en" ns: ID = "56" > <ns: full-name> Боб Оз </ ns: full-name> <ns: manages xml: lang = "en" ns: 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 ( struct soap * , const ns__employee_record * );
Чтобы прочитать запись о сотруднике из файла XML:
структура мыла * ctx = soap_new (); ctx -> recvfd = open ( "employee.xml" , O_RDONLY ); если ( ctx -> recvfd ) { ns__employee_record сотрудник ; if ( soap_read_ns__employee_record ( ctx , & employee ) == SOAP_OK ) ... закрыть ( ctx -> recvfd ); } soap_end ( ctx); soap_destroy ( ctx ); // также удаляет данные сотрудников soap_free ( ctx );
Анализируемый XML внутренне проверяется на соответствие ограничениям привязки данных.
XML REST API [ править ]
Данные приложения можно отправлять и получать в / из службы REST XML. Связывание данных XML обеспечивает вызовы REST XML API. Например, учитывая привязку данных XML ns__employee_record из предыдущего раздела, автоматически генерируются следующие операции GET, PUT и POST:
int soap_GET_ns__employee_record ( struct soap * , const char * URL , ns__employee_record * ); int soap_PUT_ns__employee_record ( struct soap * , const char * URL , const ns__employee_record * ); int soap_POST_send_ns__employee_record ( struct soap * , const char * URL , const ns__employee_record *); int soap_POST_recv_ns__employee_record ( структура мыла * , ns__employee_record * );
Функции POST должны вызываться вместе, сначала POST_send для передачи данных XML на URL-адрес конечной точки, а затем POST_recv для приема данных ответа (может быть другого типа).
Полученный XML внутренне проверяется на соответствие ограничениям привязки данных.
Особенности [ править ]
- Привязка XML-данных для C и C ++ на основе автоматического программирования с генерацией исходного кода
- Настраиваемая автоматическая генерация исходного кода клиент / сервер в ANSI C и ISO C ++
- Интегрированный высокоскоростной, специфичный для схемы XML-синтаксический анализ с проверкой XML
- Язык описания веб-сервисов (WSDL) 1.1 и 2.0
- Веб-сервисы SOAP 1.1 и 1.2
- Механизм оптимизации потоковой передачи сообщений (MTOM) и вложения DIME / MIME
- Передача репрезентативного состояния (REST) HTTP (S) 1.0 / 1.1
- Подтвержденный WS-I Basic Profile 1.0a, 1.1 и 1.2 совместим
- Проверенные шаблоны схемы W3C для привязки данных , полное покрытие тестовых шаблонов
- XML-RPC для C и C ++
- JSON для C и C ++
- RSS 0.91, 0.92, 2.0
- WS-Security
- WS-Policy 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
- Универсальный API обнаружения и интеграции описания (UDDI) v2
- Базовая и дайджест-аутентификация 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)
Ссылки [ править ]
- ^ a b ван Энгелен, Роберт (2008). «Платформа для сервис-ориентированных вычислений с компонентами веб-сервисов C и C ++». ACM-транзакции по Интернет-технологиям . 8 (3): 106–115. DOI : 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.
См. Также [ править ]
- Начало работы с gSOAP
- страница проекта на SourceForge
- Связывание данных XML
- Сериализация
- Список фреймворков веб-сервисов
- Список спецификаций веб-сервисов