gSOAP
Разработчик(и) | Роберт ван Энгелен |
---|---|
Первоначальный выпуск | 8 декабря 2000 г |
Стабильная версия | 2.8.131
/ 23 сентября 2023 г. |
Репозиторий | |
Написано в | С и С++ |
Операционная система | Кросс-платформенный |
Тип | Программное обеспечение для веб-разработки |
Лицензия | 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 (анализ по запросу) [ 3 ] [ 4 ] и сериализация данных C/C++ непосредственно в XML , а затем и в SOAP . Проект удался [ 5 ] при определении типобезопасных привязок данных между типами XML-схемы и широким спектром типов данных C/C++ . В наборе инструментов используется автоматическое программирование для упрощения разработки и вызова веб-сервисов с использованием эффективных автоматически генерируемых сериализаторов XML для прямой отправки и получения данных C/C++. Инструмент на основе компилятора, ориентированный на конкретную предметную область, генерирует исходный код, который эффективно преобразует собственные структуры данных C/C++ в XML и обратно. [ 1 ] В дальнейшем набор инструментов был разработан для поддержки протокола обмена сообщениями веб-служб SOAP, представленного примерно в то же время (отсюда и название « gSOAP ») ( общий XML и SOAP ), а также для использования этого подхода для обмена научными данными. [ 6 ] Дальнейшая разработка и обслуживание программного обеспечения осуществлялись под контролем Genivia Inc. Это включает добавление новых возможностей обработки WSDL и XML-схем , а также добавление многих возможностей протокола веб-сервисов WS-*, таких как оптимизация WS-Security, [ 7 ] Обмен сообщениями XML-RPC , поддержка формата данных JSON , подключаемые модули для интеграции gSOAP с веб-серверами Apache и IIS, а также подключаемые модули сторонних производителей, например, для Grid-сервисов. [ 8 ] [ 9 ] Инструментарий gSOAP написан на переносимом языке C/C++ и использует форму начальной загрузки путем создания собственного кода для реализации преобразователя для преобразования спецификаций WSDL/XSD в исходный код C/C++ для привязок метаданных WSDL/XSD. Программное обеспечение gSOAP лицензируется по лицензии GPLv2 с открытым исходным кодом и лицензиям на коммерческое использование исходного кода. Программное обеспечение gSOAP широко используется в промышленных проектах. [ 10 ] и критически важные инфраструктуры.
Операции веб-сервиса XML на примере
[ редактировать ]Пример операции веб-сервиса на языке C для получения стоимости проживания в отеле с учетом количества гостей можно объявить в аннотированной форме как
//gsoap ns service namespace: tempuri
//gsoap ns service style: document
//gsoap ns service encoding: literal
int ns__get_rate(char* hotel, int guests, float *rate);
Последний параметр функции всегда является возвращаемым значением службы, которое может быть обозначено как void для односторонних операций и должно быть структурой/классом для объединения нескольких возвращаемых параметров службы. Возвращаемое значение функции int используется для диагностики ошибок.
Вызов службы в C с использованием автоматически созданной функции Soap_call_ns__get_rate выполняется следующим образом:
const char *URL = "http://www.example.com/hotels";
const char *action = NULL;
struct soap *ctx = soap_new(); // new context
float rate;
int err = soap_call_ns__get_rate(ctx, URL, action, "Happy Inn", 2, &rate);
if (err == SOAP_OK && rate < 100.00)
lets_go();
soap_end(ctx); // deallocate deserialized data
soap_free(ctx); // deallocate context
Чтобы облегчить реализацию веб-сервисов для устаревших систем C и C++, префикс имен идентификаторов в C/C++ можно опустить или заменить двоеточием, например ns:get_rate, а не ns__get_rate. Пунктуация удалена в автоматически создаваемом исходном коде, который используется в сборках проекта.
Вызов службы в C++ с использованием автоматически созданного класса Proxy выполняется следующим образом (с использованием URL-адреса конечной точки прокси-сервера по умолчанию и значений действий SOAP):
Proxy proxy;
float rate;
int err = proxy.get_rate("Happy Inn", 2, &rate);
if (err == SOAP_OK && rate < 100.00)
lets_go();
proxy.destroy(); // deallocate deserialized data
Используя аннотации и соглашения об именах идентификаторов, т. е. уточняя префикс ns__ для функции ns__get_rate и объявляя свойства пространства имен ns с помощью директив //gsoap в примере, устанавливается привязка к операциям веб-службы. Автоматически созданный документ языка описания веб-служб (WSDL) объявляет сообщение запроса, ответное сообщение, а также интерфейс portType операции получения скорости и привязку 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" element="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="literal"/>
</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="guests" 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(char *hotel, int guests, float *rate)
{
*rate = ... // determine the lodging rate of the hotel given the number of guests
return SOAP_OK;
}
Нет никаких ограничений на тип параметров операции, которые можно маршалировать в XML для обмена сообщениями веб-службы, за исключением того, что для установления привязки данных необходимо соблюдать определенные соглашения об объявлении типов и аннотации.
Привязка XML-данных на примере
[ редактировать ]Чтобы установить привязку данных XML к типам данных C/C++, gSOAP использует три основные формы аннотаций исходного кода: директивы, соглашения об именовании идентификаторов и пунктуацию.
Полностью аннотированное объявление структуры на языке C для иерархической записи сотрудника может выглядеть так:
//gsoap ns schema namespace: tempuri
//gsoap ns schema form: qualified
struct ns__employee_record
{
@char *xml__lang = "en";
@int ID = 9999;
char *full_name 1:1;
$int size 0:12;
struct ns__employee_record *manages;
};
где используются следующие аннотации и соглашения:
- Квалификация типов и членов пространства имен по соглашениям об именах идентификаторов: 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="qualified" attributeFormDefault="qualified">
<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 сопоставляются с частицами последовательности или из них, перечисления сопоставляются с перечислениями simpleType XML-схемы или из них. а стандартные примитивные типы C/C++ сопоставляются с типами XSD или из них. Для преобразования схемы XSD в типы данных C/C++ фактическое сопоставление можно настроить в gSOAP с помощью файла сопоставления типов.
Экземпляр примерной иерархической структуры сотрудников по умолчанию сериализуется в XML в виде дерева, например
<ns:employee xmlns:ns="tempuri" xml:lang="en" ns:ID="12">
<ns:full-name>Jane Doe</ns:full-name>
<ns:manages xml:lang="en" ns:ID="34">
<ns:full-name>John Doe</ns:full-name>
</ns:manages>
<ns:manages xml:lang="en" ns:ID="56">
<ns:full-name>Bob Oz</ns:full-name>
<ns:manages xml:lang="en" ns:ID="78">
<ns:full-name>Alice Oz</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(struct soap*, ns__employee_record*);
int soap_write_ns__employee_record(struct soap*, const ns__employee_record*);
Чтобы прочитать запись о сотруднике из XML-файла:
struct soap *ctx = soap_new();
ctx->recvfd = open("employee.xml", O_RDONLY);
if (ctx->recvfd)
{
ns__employee_record employee;
if (soap_read_ns__employee_record(ctx, &employee) == SOAP_OK)
...
close(ctx->recvfd);
}
soap_end(ctx);
soap_destroy(ctx); // also deletes employee data
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(struct soap*, 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 1.0a, 1.1 и 1.2.
- Проверенные шаблоны схем W3C для привязки данных , полное покрытие тестовых шаблонов
- XML-RPC для C и C++
- JSON для C и C++
- РСС 0.91, 0.92, 2.0
- WS-Безопасность
- WS-Policy 1.2, 1.5 и WS-SecurityPolicy 1.2
- WS-адресация 2003/03, 2004/03, 2005/03
- WS-ReliableMessaging 1.0 и 1.1
- WS-Дискавери 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)
Ссылки
[ редактировать ]- ^ Jump up to: а б ван Энгелен, Роберт (2008). «Среда для сервис-ориентированных вычислений с компонентами веб-служб C и C++». Транзакции ACM по Интернет-технологиям . 8 (3): 106–115. дои : 10.1145/1361186.1361188 . S2CID 10240041 .
- ^ Jump up to: а б ван Энгелен, Роберт; Галливан, Кайл (2002). Набор инструментов gSOAP для веб-сервисов и одноранговых вычислительных сетей . Международный симпозиум IEEE по кластерным вычислениям и сетям Grid. стр. 128–135.
- ^ Руководитель, Майкл; Говиндераджу, Мадху; Сломинский, Александр; Лю, Пу; Абу-Газале, Наиф; ван Энгелен, Роберт; Чиу, Кеннет (2005). Сравнительный анализ процессоров XML для приложений в веб-службах Grid . IEEE/ACM Суперкомпьютер (SC).
- ^ Руководитель, Майкл; Говиндераджу, Мадху; ван Энгелен, Роберт; Чжан, Вэй (2006). Сравнительный анализ процессоров XML для приложений в веб-службах Grid . IEEE/ACM Суперкомпьютер (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 г., семинар по моделям, алгоритмам и методологиям для вычислительной среды с поддержкой Grid (MAMGCE), Springer Verlag LNCS, том 4967. стр. 894–901.
- ^ Челленер, Дэвид; Йодер, Кент; Катерман, Райан; Саффорд, Дэвид; Ван Доорн, Леендерт (2007). Практическое руководство по надежным вычислениям . Пирсон Образование.