GSOAP - gSOAP

gSOAP
Разработчики)Роберт ван Энгелен
изначальный выпуск8 декабря 2000 г.; 20 лет спустя (2000-12-08)
Стабильный выпуск
2.8.107 / 6 октября 2020 г. (2020-10-06)
Репозиторий Отредактируйте это в Викиданных
Написано в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 внутренне проверяется на соответствие ограничениям привязки данных.

Функции

Рекомендации

  1. ^ а б ван Энгелен, Роберт (2008). «Структура для сервис-ориентированных вычислений с компонентами веб-сервисов C и C ++». ACM-транзакции по интернет-технологиям. 8 (3): 106–115. Дои:10.1145/1361186.1361188.
  2. ^ а б ван Энгелен, Роберт; Галливан, Кайл (2002). Набор инструментов gSOAP для веб-служб и одноранговых вычислительных сетей. Международный симпозиум IEEE по кластерным вычислениям и сетям. С. 128–135.
  3. ^ Голова, Майкл; Говиндераджу, Мадху; Сломинский, Александр; Лю, Пу; Абу-Газале, Найеф; ван Энгелен, Роберт; Чиу, Кеннет (2005). Тестирование процессоров XML для приложений в Grid Web Services. IEEE / ACM Supercomputing (SC).
  4. ^ Голова, Майкл; Говиндераджу, Мадху; ван Энгелен, Роберт; Чжан, Вэй (2006). Тестирование процессоров XML для приложений в Grid Web Services. IEEE / ACM Supercomputing (SC).
  5. ^ ван Энгелен, Роберт; Говиндараджу, Мадху; Чжан, Вэй (2006). Изучение согласованности удаленных объектов в веб-службах XML. Международная конференция по веб-сервисам (ICWS). С. 249–256.
  6. ^ ван Энгелен, Роберт (2003). Расширяя границы SOAP с помощью веб-сервисов для научных вычислений. Конференция по веб-сервисам (ICWS). С. 346–354.
  7. ^ Роберт, ван Энгелен; Чжан, Вэй (2008). Обзор и оценка оптимизации производительности безопасности веб-служб. Международная конференция IEEE по веб-сервисам (ICWS). С. 137–144.
  8. ^ Алоизио, Джованни; Кафаро, Массимо; Эпикоко, Итало; Лецци, Даниэле; ван Энгелен, Роберт (2005). Подключаемый модуль GSI для gSOAP: повышенная безопасность, производительность и надежность. Международная конференция по информационным технологиям (ITCC). С. 304–309.
  9. ^ Кафаро, Массимо; Лецци, Даниэле; Фиоре, Сандро; Алоизио, Джованни; ван Энгелен, Роберт (2007). Подключаемый модуль GSI для gSOAP: создание межсетевых взаимодействующих безопасных сетевых сервисов. Международная конференция по параллельной обработке и прикладной математике (PPAM) 2007, семинар по моделям, алгоритмам и методологиям для вычислительной среды с поддержкой грид (MAMGCE), Springer Verlag LNCS Volume 4967. pp. 894–901.
  10. ^ Челленер, Дэвид; Йодер, Кент; Катерман, Райан; Саффорд, Дэвид; Ван Дорн, Леендерт (2007). Практическое руководство по надежным вычислениям. Pearson Education.

Смотрите также