Jump to content

gSOAP

(Перенаправлено с Gsoap )
gSOAP
Разработчик(и) Роберт ван Энгелен
Первоначальный выпуск 8 декабря 2000 г .; 23 года назад ( 08.12.2000 )
Стабильная версия
2.8.131 / 23 сентября 2023 г. ( 23.09.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 внутренне проверяется на соответствие ограничениям привязок данных.

Данные приложения можно отправлять и получать в/из службы 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 внутренне проверяется на соответствие ограничениям привязок данных.

  1. ^ Jump up to: а б ван Энгелен, Роберт (2008). «Среда для сервис-ориентированных вычислений с компонентами веб-служб C и C++». Транзакции ACM по Интернет-технологиям . 8 (3): 106–115. дои : 10.1145/1361186.1361188 . S2CID   10240041 .
  2. ^ Jump up to: а б ван Энгелен, Роберт; Галливан, Кайл (2002). Набор инструментов gSOAP для веб-сервисов и одноранговых вычислительных сетей . Международный симпозиум IEEE по кластерным вычислениям и сетям Grid. стр. 128–135.
  3. ^ Руководитель, Майкл; Говиндераджу, Мадху; Сломинский, Александр; Лю, Пу; Абу-Газале, Наиф; ван Энгелен, Роберт; Чиу, Кеннет (2005). Сравнительный анализ процессоров XML для приложений в веб-службах Grid . IEEE/ACM Суперкомпьютер (SC).
  4. ^ Руководитель, Майкл; Говиндераджу, Мадху; ван Энгелен, Роберт; Чжан, Вэй (2006). Сравнительный анализ процессоров XML для приложений в веб-службах Grid . IEEE/ACM Суперкомпьютер (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 г., семинар по моделям, алгоритмам и методологиям для вычислительной среды с поддержкой Grid (MAMGCE), Springer Verlag LNCS, том 4967. стр. 894–901.
  10. ^ Челленер, Дэвид; Йодер, Кент; Катерман, Райан; Саффорд, Дэвид; Ван Доорн, Леендерт (2007). Практическое руководство по надежным вычислениям . Пирсон Образование.

См. также

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 6564dfc33c928b0e619c48abd23ba40e__1696706940
URL1:https://arc.ask3.ru/arc/aa/65/0e/6564dfc33c928b0e619c48abd23ba40e.html
Заголовок, (Title) документа по адресу, URL1:
gSOAP - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)