Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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)

Ссылки [ править ]

  1. ^ a b ван Энгелен, Роберт (2008). «Платформа для сервис-ориентированных вычислений с компонентами веб-сервисов C и C ++». ACM-транзакции по Интернет-технологиям . 8 (3): 106–115. DOI : 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.

См. Также [ править ]

  • Начало работы с gSOAP
  • страница проекта на SourceForge
  • Связывание данных XML
  • Сериализация
  • Список фреймворков веб-сервисов
  • Список спецификаций веб-сервисов