gSOAP
Utvecklare | Robert van Engelen |
---|---|
Initial release | 8 december 2000 |
Stabil frisättning | 2.8.107 / 6 oktober 2020
|
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
- XML-databindning för C och C++ baserad på automatisk programmering med generering av käll-till-källkod
- Anpassningsbar klient/serverkällkod automatisk generering i ANSI C och ISO C++
- Integrerad höghastighets-, schemaspecifik XML-pull-parsing med XML-validering
- Web Services Description Language (WSDL) 1.1 och 2.0
- Webbtjänster SOAP 1.1 och 1.2
- Optimeringsmekanism för strömmande meddelandeöverföring (MTOM) och DIME/MIME-bilagor
- Representativ tillståndsöverföring (REST) HTTP(S) 1.0/1.1
- Verifierad WS-I Basic Profile 1.0a, 1.1 och 1.2-kompatibel
- Verifierade W3C-schemamönster för databindning , fullständig täckning av testmönster
- XML-RPC för C och C++
- JSON för C och C++
- RSS 0,91, 0,92, 2,0
- WS-Säkerhet
- WS-Policy 1.2, 1.5 och WS-SecurityPolicy 1.2
- WS-adressering 2003/03, 2004/03, 2005/03
- WS-ReliableMessaging 1.0 och 1.1
- WS-Discovery 1.0/1.1
- SOAP-over-UDP
- Universal Description Discovery and Integration (UDDI) v2 API
- HTTP grundläggande autentisering och sammanfattningsautentisering, NTLM-autentisering, proxyautentisering
- IPv4 och IPv6 med SSL/TLS med SSL-sessionscache (baserat på OpenSSL eller GNUTLS )
- XML-komprimering med gzip
- Apache 1.x- och 2.0-moduler, IIS ISAPI- och WinInet -moduler, CGI och FastCGI
- Stöd för fristående webbserver (multithreaded, pooling)
- Integrerad minneshantering med avallokering och läcksökning
- Arkitektur med plug-ins för ytterligare funktioner
- Internationalisering/lokaliseringsstöd (UTF8, UCS4, MB-kodningar, etc.)
- Plattformsneutral, stöder små enheter (Symbian, VxWorks, Android, iPhone)
Se även
- Komma igång med gSOAP
- projektsida på SourceForge
- XML-databindning
- Serialisering
- Lista över webbtjänstramar
- Lista över webbtjänstspecifikationer