gSOAP

gSOAP
Utvecklare Robert van Engelen
Initial release 8 december 2000 ; 22 år sedan ( 2000-12-08 )
Stabil frisättning
2.8.107 / 6 oktober 2020 ( 2020-10-06 )
Förvar
Skrivet i C och C++
Operativ system Cross-plattform
Typ Programvara för webbutveckling
Licens GPL v2 , kommersiell licensiering
Hemsida
https://www.genivia.com/dev.html https://sourceforge.net/projects/gsoap2/

gSOAP är en C och C++ programvaruutvecklingsverktygssats för SOAP / XML- webbtjänster och generiska XML-databindningar . Med en uppsättning C/C++-typdeklarationer genererar de kompilatorbaserade gSOAP-verktygen serialiseringsrutiner i källkoden för effektiv XML- serialisering av de specificerade C- och C++-datastrukturerna. Serialisering kräver noll kopior .

Historia

gSOAP-verktygslådan startade som ett forskningsprojekt vid Florida State University av professor Robert van Engelen 1999. Projektet introducerade nya metoder för högeffektiv XML-parsning (pull parsing) och serialisering av C/C++-data direkt i XML och senare även i TVÅL . Projektet lyckades definiera typsäkra databindningar mellan XML Schema- typer och en mängd olika C/C++-datatyper . Verktygslådan använder automatisk programmering för att förenkla utvecklingen och anropandet av webbtjänster med hjälp av effektiva automatiskt genererade XML-serializers för att skicka och ta emot C/C++-data direkt. Ett domänspecifikt kompilatorbaserat verktyg genererar källkod som effektivt konverterar inbyggda C/C++-datastrukturer till XML och tillbaka. Verktygslådan utvecklades vidare för att stödja meddelandeprotokollet SOAP webbtjänster, som introducerades vid ungefär samma tid, därför namnet " gSOAP " ( generisk XML och SOAP ) och för att använda metoden för vetenskapligt datautbyte. Ytterligare utveckling och underhåll av mjukvaran skedde under ägande av Genivia Inc. Detta inkluderar tillägg av nya WSDL- och XML-schemabehandlingsmöjligheter samt tillägg av många WS-* webbtjänsters protokollfunktioner såsom WS-Security optimizations, XML- RPC- meddelanden, stöd för JSON- dataformatet, plugin-moduler för att integrera gSOAP i Apache- och IIS-webbservrar och tredjepartsplugins som för Grid Services. gSOAP-verktygssatsen är skriven i bärbar C/C++ och använder en form av bootstrapping genom att generera sin egen kod för att implementera en omvandlare för att översätta WSDL/XSD-specifikationer till C/C++-källkod för WSDL/XSD-metadatabindningar. GSOAP-programvaran är licensierad under GPLv2-licensen för öppen källkod och kommersiella källkodslicenser. GSOAP-mjukvaran används ofta i industriella projekt och verksamhetskritiska infrastrukturer.

XML Web Service Operations by Exempel

Ett exempel på webbtjänstoperation i C för att hämta logipriset för ett hotell med ett antal gäster kan deklareras i kommenterad form som




       //gsoap ns tjänstnamnområde: tempuri  //gsoap ns tjänstestil: dokument  //gsoap ns tjänstkodning: literal  int  ns__get_rate  (  char  *  hotel  ,  int  guests  ,  float  *  rate  ); 

Funktionens sista parameter är alltid tjänstreturvärdet, vilket kan betecknas som ogiltigt för envägsoperationer och bör vara en struktur/klass för att bunta ihop flera tjänstreturparametrar. Funktionens int returvärde används för feldiagnostik.

En tjänstanrop i C med den automatiskt genererade soap_call_ns__get_rate-funktionen exekveras enligt följande:

    
    
      
 
        
       
  
   
   const  char  *  URL  =  "http://www.example.com/hotell"  ;  const  char  *  action  =  NULL  ;  struct  tvål  *  ctx  =  tvål_ny  ();  // nytt sammanhang  flytande  ränta  ;  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  );  // deallokera deserialiserad data  soap_free  (  ctx  );  // deallokera sammanhang 

För att underlätta implementeringar av webbtjänster för äldre C- och C++-system, kan prefixkvalificeringen för identifierarnamn i C/C++ utelämnas eller kan ersättas med kolonnotation, till exempel ns:get_rate snarare än ns__get_rate. Skiljetecken tas bort i den automatiskt genererade källkoden som används i projektbyggen.

En tjänstanrop i C++ med den automatiskt genererade proxyklassen exekveras enligt följande (med hjälp av proxyns standardslutpunkts-URL och SOAP-åtgärdsvärden):

 
 
     
       
  
   Proxy  proxy  ;  flytande  ränta  ;  int  err  =  proxy  .  get_rate  (  "Happy Inn"  ,  2  ,  &  rate  );  if  (  err  ==  SOAP_OK  &&  rate  <  100.00  )  lets_go  ();  proxy  .  förstöra  ();  // deallokera deserialiserad data 

Genom att använda annoteringar och namngivningskonventioner för identifierare, dvs kvalificering med prefixet ns__ för funktionen ns__get_rate och genom att deklarera egenskaper för ns-namnområdet med hjälp av //gsoap-direktiven i exemplet, upprättas en bindning till webbtjänstoperationer. Det automatiskt genererade WSDL-dokumentet (Web Services Description Language) deklarerar ett förfrågningsmeddelande, ett svarsmeddelande och portType-gränssnittet för get-rate operation och SOAP-bindning för ns__get_rate-funktionen enligt följande:

    
   
   

 
   


 
  
   
   
 


  
   
  
   
  
     
  
  
     
  
 
 <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> 

där förfrågnings- och svarsmeddelandena för operationen hänvisar till XML-element som definieras i WSDL-delens typer enligt följande:


    
   
   
    
          
         
    
   
  
   
   
    
          
    
   
  
 
 <typer>  <schema  targetNamespace=  "tempuri"  ...  >  <elementnamn  =  "get-rate"  >  <complexType>  <sekvens>  <  elementnamn=  "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> 

På samma sätt kan klient- och server C/C++-källkod genereras automatiskt från en uppsättning WSDL:er och XML-scheman. Tjänsterna måste slutföras genom att definiera lämpliga tjänsteoperationer. Till exempel måste den automatiskt genererade C++-tjänstklassen för denna WSDL fyllas i genom att definiera get_rate-metoden enligt följande:

      

      
   
 int  Service::get_rate  (  char  *  hotel  ,  int  guests  ,  float  *  rate  )  {  *  rate  =  ...  // bestäm logipriset för hotellet givet antalet gäster  retur  SOAP_OK  ;  } 

Det finns inga begränsningar för typen av operationsparametrar som kan sorteras i XML för webbtjänstmeddelanden, förutom att vissa typdeklarationskonventioner och anteckningar bör följas för att upprätta en databindning.

XML-databindning genom exempel

För att upprätta en XML-databindning med C/C++-datatyper använder gSOAP tre grundläggande former av källkodsanteckning: direktiv, namnkonventioner för identifierare och skiljetecken.

En fullständigt kommenterad strukturdeklaration i C för en hierarkisk personalpost kan visas som



 

        
                 
                    
                     0
      
 //gsoap ns schema namnutrymme: tempuri  //gsoap ns schema form: kvalificerad  struct  ns__employee_record  {  @  char  *  xml__lang  =  "en"  ;  @  int  ID  =  9999  ;  char  *  full_name  1  :  1  ;  $int  storlek  :  12  ;  struct  ns__employee_record  *  hanterar  ;  }; 

där följande anteckningar och konventioner används:

  • namnområdeskvalificering av typer och medlemmar genom namnkonventioner för identifierare: ns__employee_record, xml__lang
  • attribut för medlemmar: @char*, @int
  • standardvärden för medlemmar: xml__lang = "en", ID = 9999
  • förekomstbegränsningar i form av minOccurs : maxOccurs för XML-validering: fullständigt_namn 1:1, storlek 0:12
  • dynamiska arrayer av elementsekvenser består av ett par av ett specialstorleksfält och en arraypekarmedlem: $int size; struct ns__employee_record *hanterar

gSOAP-verktygen konverterar C/C++-datatyper till/från XML-schemadatatyper. Eftersom C inte stöder namnutrymmen och struktur-/klassmedlemsnamn inte kan namnområdeskvalificeras i C++, tillåter användningen av namngivningskonventioner för identifierare i gSOAP att binda den här strukturen och dess medlemmar till en XML-schemakomplexTyp som automatiskt genereras enligt följande:

  
   
   

   
   
         
        
   
      
       
  

 <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=  "sv"  />  <attribute  name=  "ID"  type=  "xsd:int"  use=  "default"  default=  "9999"  />  </complexType>  </schema> 

Vidare mappas förbund i en struktur/klass som är annoterade med ett speciellt väljarfält för val av fackföreningsmedlem till/från schemavalspartiklar, STL-behållare mappas till/från sekvenspartiklar, uppräkningar mappas till/från XML-schema simpleType-uppräkningar, och standard C/C++ primitiva typer mappas till/från XSD-typer. För konvertering av XSD-schema till C/C++-datatyper är den faktiska mappningen konfigurerbar i gSOAP med en typmappningsfil.

En instans av exemplets hierarkiska anställdsstruktur serialiseras i XML som ett träd som standard, till exempel

   
 
   
  
 
   
  
    
   
  
 
 <ns:employee  xmlns:ns=  "tempuri"  xml:lang=  "en"  ns:ID=  "12"  >  <ns:full-name>  Jane Doe  </ns:full-name>  <ns:manages  xml:lang =  "sv"  ns:ID=  "34"  >  <ns:full-name>  John Doe  </ns:full-name>  </ns:manages>  <ns:manages  xml:lang=  "sv"  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> 

När SOAP-kodningsstilen är aktiverad, respekterar XML-serialiseringen i gSOAP samrefererade objekt och cykliska datastrukturer enligt SOAP-kodningsregler, vilket resulterar i XML med id-ref- kanter.

Den automatiskt genererade XML-databindningen inkluderar läs- och skrivoperationer till/från en fil, sträng eller ström. Till exempel har ett ns__employee_record-objekt läs- och skrivoperationer:

   
     int  soap_read_ns__employee_record  (  struct  soap  *  ,  ns__employee_record  *  );  int  soap_write_ns__employee_record  (  struct  soap  *  ,  const  ns__employee_record  *  ); 

Så här läser du en anställdspost från en XML-fil:

    
   
 

   
      
    
  


 
 struct  tvål  *  ctx  =  tvål_ny  ();  ctx  ->  recvfd  =  öppen  (  "anställd.xml"  ,  O_RDONLY )   ;  if  (  ctx  ->  recvfd  )  {  ns__employee_record  anställd  ;  if  (  soap_read_ns__employee_record  (  ctx  ,  &  anställd  )  ==  SOAP_OK  )  ...  stäng  (  ctx  ->  recvfd  );  }  soap_end  (  ctx  );  soap_destroy  (  ctx  );  // tar också bort anställdas data  soap_free  (  ctx  ); 

Parsed XML är internt validerad mot databindningarnas begränsningar.

XML REST API

Applikationsdata kan skickas och tas emot till/från en REST XML-tjänst. XML-databindningen tillhandahåller REST XML API-anrop. Till exempel, med tanke på ns__employee_record XML-databindningen i föregående avsnitt, genereras följande GET-, PUT- och POST-operationer automatiskt:

      
       
       
    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-funktionerna ska anropas, först en POST_send för att överföra XML-data till slutpunkts-URL följt av en POST_recv för att acceptera svarsdata (kan vara av en annan typ).

Mottagen XML valideras internt mot databindningarnas begränsningar.

Funktioner

Se även