OpenVMS Notes: SOAP, Apache AXIS2, gSOAP

  1. The VMS SharkThe information and software presented on this web site are intended for educational use only by OpenVMS application developers and OpenVMS system attendants.
  2. The information and software presented on this web site are provided free of charge.
  3. The information and software presented on this web site are presented to you as-is. I will not be held responsible in any way if the information and software presented on this web site damages your computer system, business or organization (sounds like the legal warning from a Microsoft shrink-wrap seal, eh?)
  4. Is this text too small? You have two options:
    1. hold down the CTRL key while rolling the mouse wheel (zoom-in, zoom-out)
    2. use your keyboard like so:
      • hit: CTRL with "-" key to zoom smaller
      • hit: CTRL with "+" key to zoom larger
      • hit: CTRL with zero key to reset zoom
 

Table of Contents

e-Business Product Name Confusion (re: OpenVMS)

e-Business Product Name Confusion
Product Description/Notes
ANT Another Neat Tool (an Apache scripting tool meant to replace various OS script interpreters)
Apache HTTPd Hyper Text Transport Protocol daemon is a standalone product which operates on TCP/IP ports 80 (http) and 443 (https) by default. When OpenVMS was owned by Compaq, this product was called CSWS (Compaq Secure Web Sever) pronounced "C-Swiss". Since HP bought (err, merged with) Compaq, I have heard HP engineers refer to this product as "Swiss" but the downloadable modules still have a "CSWS" prefix.
- CSWS_JAVAHP's name for Apache Tomcat (requires Java)
- CSWS_PERLHP's name for a module which enables Apache HTTPd to access Perl (requires Perl)
- CSWS_PHPHP's name for a module which provides Apache HTTPd with a PHP Interpreter
Apache TomcatA standalone Java-based web server product which operates on TCP/IP port 8080 by default
(configure the connector kit to facilitate back channels between HTTPd and Tomcat)
Confusingly, the Compaq/HP Tomcat module for OpenVMS is named CSWS_JAVA
- JakartaApache's umbrella name for Java projects
- Catalina Name of Tomcat's Servlet Container Technology
- CoyoteTomcat's Java-based HTTPd server
- JasperTomcat's JSP (Java Server Page) technology
GNV GNU Not VMS (Unix-like command interpreter for OpenVMS which includes BASH)
JavaStandalone product required by Tomcat. You want the development kit (because of the JIT compiler), not the run-time kit.
1.5
and
higher
  1.4
and
lower
 
JDK java development kit SDK standard development kit
JRE java runtime edition RTE run time edition
OpenSSLSecure Sockets Layer standalone product (not used by Apache HTTPd which has its own built-in SSL routines)
Question: So why would you ever use it? Answer: to support encryption in client apps or standalone server apps
Required by OpenVMS 8.x (used to validate HP patch kits)
PerlStandalone product (required by CSWS_PERL)
SOAP Toolkit 1.1 SOAP 1.0 - based upon Apache SOAP 2.31 - Apache's proof-of-concept SOAP offering (now obsolete)
SOAP Toolkit 2.0 SOAP 1.1 - based upon Apache AXIS/Java - Apache's first production SOAP engine (now obsolete)
AXIS2 SOAP 1.2 - based upon Apache AXIS2/Java - Apache's second production SOAP engine
SSLSecure Sockets Layer standalone product (not used by Apache HTTPd which has its own built-in SSL routines)
Question: So why would you ever use it? Answer: to support encryption in client apps or standalone server apps
Required by OpenVMS 8.x (used to validate HP patch kits)
WSITWeb Services Integration Toolkit (technology for accessing high level language routines from Java-based web services)
UDDIUniversal Description Discovery and Integration is another Web Services component
(this technology has not lived up to original expectations)
gSOAP generated SOAP. A third-party SOAP engine supporting code written in either C or C++
(this looks like a very promising alternative to AXIS2/c which is not available on OpenVMS unless you are willing to do your own build from Apache sources)

Installing Apache SOAP on OpenVMS

SOAP (Simple Object Access Protocol) is an XML extension for sending messages to other systems on the internet. It is platform neutral as well a language neutral.

AXIS (Apache eXtensible Interaction System)

SOAP
Technology
Original
Product
Name
Official
VMS
Name
Requires
Tomcat?
Document Links Language
SOAP 1.0 Apache SOAP SOAP Toolkit 1.x Y http://www.w3.org/TR/soap/ Java
SOAP 1.1 Apache AXIS/Java SOAP Toolkit 2.x Y http://en.wikipedia.org/wiki/Apache_Axis Java
SOAP 1.1 and 1.2 Apache AXIS2/Java Axis2 Y http://en.wikipedia.org/wiki/Apache_Axis2 Java
SOAP 1.1 and 1.2 gSOAP   N http://www.cs.fsu.edu/~engelen/soap.html C/C++

Notes:

Installing AXIS2 (supports SOAP 1.1 and SOAP 1.2) on Tomcat

Installing AXIS (only supports SOAP 1.1) on Tomcat

 Caveat: do not install AXIS if possible. AXIS2 is faster and much more feature-rich.

AXIS/AXIS2 Tutorials etc.

Miscellaneous notes and hints

"Army Instructions" for creating an AXIS2 Service on OpenVMS

==============================================================================================
title    : AAA_help.TXT
author   : Neil Rieck
date     : 2010.07.21
purpose  : A "Simple Service" demo for Apache Axis2 on OpenVMS-8.3
reference: http://people.apache.org/~ruchithf/hw-axis2/
notes    : 1. the original steps have been modified for use on OpenVMS
         : 2. case is important for directories
         : 3. AXIS2 will not deploy a service unless the extension is ".aar"
         : 4. my DCL script "SENS" will toggle process case-sensitivity
         : 5. some variable and method names have been changed to assist in WSDL + XSD hacking
==============================================================================================

step1   -------------------------------------------------------------------------
        $ create SimpleService.java
        ...using these contents (which I modified from the source)

	/**
	 * The service implementation class
	 */
	public class SimpleService {
		/**
		 * The ssAdd method will be exposed as operation ssAdd
		 *
		 * note: the "ss" prefix means "simple service"
		 */
		public int ssAdd(int ssValue1, ssValue2) {
			return ssValue1 + ssValue2;
		}
		/**
		 * The ssSubtract method will be exposed as operation ssSubtract
		 */
		public int ssSubtract(int ssValue1, ssValue2) {
			return ssValue1 - ssValue2;
		}
		/**
		 * The ssEcho method will be exposed as operation ssEcho
		*/
		public String ssEcho(String ssValue3) {
			return ssValue3;
		}
	}

step2   -------------------------------------------------------------------------
        $ cre/dir [.TEMP]
        $ cre/dir [.TEMP.META-INF]
        $ create  [.TEMP.META-INF]services.xml
        ...using these contents (which I modified from the source)

        <service name="SimpleService">
            <description>
                Simple Service Hack
            </description>
            <parameter name="ServiceClass" locked="false">SimpleService</parameter>
            <operation name="ssAdd">
                <messageReceiver
                        mep="http://www.w3.org/2004/08/wsdl/in-out"                   <--- optional
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
            </operation>
            <operation name="ssSubtract">
                <messageReceiver
                        mep="http://www.w3.org/2004/08/wsdl/in-out"                   <--- optional
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
            </operation>
            <operation name="ssEcho">
                <messageReceiver
                        mep="http://www.w3.org/2004/08/wsdl/in-out"                   <--- optional
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
            </operation>
        </service>

step3   -------------------------------------------------------------------------
        $ javac "SimpleService.java" -d TEMP/     (doublequote to to preserve case)

step4   -------------------------------------------------------------------------
        $ jar "cvf" "SimpleService.aar"  "-C" TEMP/ "META-INF/services.xml"
        $ jar "uvf" "SimpleService.aar"  "-C" TEMP/ "SimpleService.class"
 
step5   -------------------------------------------------------------------------
        test the archive like so:

        $ unzip -l SimpleService.aar

        Archive:  AXIS2$ROOT:[000000.NEIL.SS]SimpleService.aar;21
          Length     Date   Time    Name
         --------    ----   ----    ----
                0  08-10-10 13:41   META-INF/
               70  08-10-10 13:41   META-INF/MANIFEST.MF
              572  08-10-10 13:40   META-INF/services.xml
              585  08-10-10 13:41   SimpleService.class
         --------                   -------
             1227                   4 files

step6   -------------------------------------------------------------------------
        put into production:

        $ copy SimpleService.aar  -
                APACHE$COMMON:[JAKARTA.TOMCAT.webapps.axis2.WEB-INF.services]

step 7	-------------------------------------------------------------------------
	Probe the service with IE8:

	http://yada.net:8080/axis2/services/listServices view the available services
	http://yada.net:8080/axis2/services/SimpleService?xsd view the associated xsd
	http://yada.net:8080/axis2/services/SimpleService?wsdl view the associated wsdl
	http://yada.net:8080/axis2/services/SimpleService?wsdl2 view the associated wsdl2

	Test the service methods with IE8:

	http://yada.net:8080/axis2/services/SimpleService/ssEcho?param0=Hello
	http://yada.net:8080/axis2/services/SimpleService/ssAdd?param0=34&param1=12
	http://yada.net:8080/axis2/services/SimpleService/ssSubtract?param0=34&param1=12

(using AXIS/AXIS2 to) Generate a WSDL Document

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
                  xmlns:ns0="http://ws.apache.org/axis2"
                  xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
                  xmlns:ns1="http://org.apache.axis2/xsd"
                  xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                  targetNamespace="http://ws.apache.org/axis2">
    <wsdl:documentation>SimpleService</wsdl:documentation>
    <wsdl:types>
        <xs:schema xmlns:ns="http://ws.apache.org/axis2"
                   attributeFormDefault="qualified"
                   elementFormDefault="qualified"
                   targetNamespace="http://ws.apache.org/axis2">
            <xs:element name="ssAdd">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="param0" type="xs:int"/>
                        <xs:element minOccurs="0" name="param1" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssAddResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssSubtract">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="param0" type="xs:int"/>
                        <xs:element minOccurs="0" name="param1" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssSubtractResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssEcho">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="param0" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssEchoResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="ssSubtractRequest">
        <wsdl:part name="parameters" element="ns0:ssSubtract"/>
    </wsdl:message>
    <wsdl:message name="ssSubtractResponse">
        <wsdl:part name="parameters" element="ns0:ssSubtractResponse"/>
    </wsdl:message>
    <wsdl:message name="ssEchoRequest">
        <wsdl:part name="parameters" element="ns0:ssEcho"/>
    </wsdl:message>
    <wsdl:message name="ssEchoResponse">
        <wsdl:part name="parameters" element="ns0:ssEchoResponse"/>
    </wsdl:message>
    <wsdl:message name="ssAddRequest">
        <wsdl:part name="parameters" element="ns0:ssAdd"/>
    </wsdl:message>
    <wsdl:message name="ssAddResponse">
        <wsdl:part name="parameters" element="ns0:ssAddResponse"/>
    </wsdl:message>
    <wsdl:portType name="SimpleServicePortType">
        <wsdl:operation name="ssSubtract">
            <wsdl:input message="ns0:ssSubtractRequest" wsaw:Action="urn:ssSubtract"/>
            <wsdl:output message="ns0:ssSubtractResponse" wsaw:Action="urn:ssSubtractResponse"/>
        </wsdl:operation>
        <wsdl:operation name="ssEcho">
            <wsdl:input message="ns0:ssEchoRequest" wsaw:Action="urn:ssEcho"/>
            <wsdl:output message="ns0:ssEchoResponse" wsaw:Action="urn:ssEchoResponse"/>
        </wsdl:operation>
        <wsdl:operation name="ssAdd">
            <wsdl:input message="ns0:ssAddRequest" wsaw:Action="urn:ssAdd"/>
            <wsdl:output message="ns0:ssAddResponse" wsaw:Action="urn:ssAddResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="SimpleServiceSOAP11Binding" type="ns0:SimpleServicePortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="ssSubtract">
            <soap:operation soapAction="urn:ssSubtract" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssEcho">
            <soap:operation soapAction="urn:ssEcho" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssAdd">
            <soap:operation soapAction="urn:ssAdd" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="SimpleServiceSOAP12Binding" type="ns0:SimpleServicePortType">
        <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="ssSubtract">
            <soap12:operation soapAction="urn:ssSubtract" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssEcho">
            <soap12:operation soapAction="urn:ssEcho" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssAdd">
            <soap12:operation soapAction="urn:ssAdd" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="SimpleServiceHttpBinding" type="ns0:SimpleServicePortType">
        <http:binding verb="POST"/>
        <wsdl:operation name="ssSubtract">
            <http:operation location="SimpleService/ssSubtract"/>   <--- notice this syntax (you can change it)
            <wsdl:input>
                <mime:content type="text/xml" part="ssSubtract"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="ssSubtract"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssEcho">
            <http:operation location="SimpleService/ssEcho"/>	    <--- notice this syntax (you can change it)
            <wsdl:input>
                <mime:content type="text/xml" part="ssEcho"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="ssEcho"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssAdd">
            <http:operation location="SimpleService/ssAdd"/>	    <--- notice this syntax (you can change it)
            <wsdl:input>
                <mime:content type="text/xml" part="ssAdd"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="ssAdd"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="SimpleService">
        <wsdl:port name="SimpleServiceSOAP11port_http" binding="ns0:SimpleServiceSOAP11Binding">
            <soap:address location="http://kawc09.on.bell.ca:8080/axis2/services/SimpleService"/>
        </wsdl:port>
        <wsdl:port name="SimpleServiceSOAP12port_http" binding="ns0:SimpleServiceSOAP12Binding">
            <soap12:address location="http://kawc09.on.bell.ca:8080/axis2/services/SimpleService"/>
        </wsdl:port>

        <wsdl:port name="SimpleServiceHttpport" binding="ns0:SimpleServiceHttpBinding">
            <http:address location="http://kawc09.on.bell.ca:8080/axis2/services/SimpleService"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

gSOAP (very, very fast)

gSOAP (all platforms)

gSOAP Toolkit for OpenVMS

gSOAP on OpenVMS

Home page of Brett Cameron & John Apps (the unofficial efforts of two HP employees)

Release Notes

VMS Pkg gSOAP Release Notes
  9 2.7.10 https://sites.google.com/a/johndapps.com/www/gSOAP-kit-notes-09.pdf
10 2.7.15 https://sites.google.com/a/johndapps.com/www/gSOAP-kit-notes-10.pdf
11 2.8.3 https://sites.google.com/a/johndapps.com/www/gSOAP-kit-notes-11.pdf
12 2.8.3 https://region-a.geo-1.objects.hpcloudsvc.com:443/v1/66395568832599/gSOAP/GSOAP-VMS-AXP-12.ZIP

Miscellaneous Stuff

Tips for using gSOAP on OpenVMS

gSOAP sample apps were written for use in a case-sensitive environment. So now you've got several options.
 

  1. Keep your DCL session in case insensitive mode but double-quote every parameter (to preserve case) like so:
    $ soapcpp2 "-c" "-S" -1 yada.h		! only generate "c" code, only generate Server code, only support soap1.1
  2. Switch to case-sensitive mode, execute your case-sensitive command, then switch back to case-insensitive mode
    $ SET PROC/CASE=SENS/PARSE=EXTENDED
    $ soapcpp2 -c -S -1 yada.h ! only generate "c" code, only generate Server code, only support soap1.1
    $ SET PROC/CASE=BLIND/PARSE=TRADITION
  3. Permanently switch your process to case sensitive and leave it there (caveat: if you previously mixed-the-case of symbols and logicals in your scripts, then you might have trouble doing anything including logging out)

Simplistic overview of gSOAP code development in C ("wdsl first" method)

Simplistic overview of gSOAP code development in C ("no wdsl" method)

Simplistic overview of gSOAP code development in C++ ("no wdsl" method)

Sample Apache configuration for plugin mod_gsoap

file: [.conf]httpd.conf
#===============================================================================
# experimental stuff for gSOAP (root)
# required so I can use a browser to look at DOCs specific to this stack
#
#	$define/sys/trans=conc "gsoap$root" "DISK$USER1:[gsoap.]"
#
#===============================================================================
Alias /gsoap/ "/gsoap$root/000000/"
Alias /GSOAP/ "/gsoap$root/000000/"
<Directory "/gsoap$root/000000/">
	Options Indexes MultiViews
	IndexOptions NameWidth=*
	AllowOverride None
	Order allow,deny
	Allow from all
</Directory>
#
# this plugin module is required for gSOAP to work
#
LoadModule gsoap_module modules/mod_gsoap.exe
#
# enabled gSOAP services
# 1. only enable the stuff we need because more stuff seems to take a toll)
# 2. SOAPLibrary must point to a valid gSOAP executable (or Apache won't start)
#===============================
#	service: calc demo
#	logical: $def/sys gsoap_calc_server CSMIS$ROOT3:[DVLP._GSOAP_SAMPLES.CALC-NSR]calcserver.EXE 
#
<Location /gsoap_calc_server>		# lowercase name (also enable in SSL.CONF if HTTPS support is desired)
	SetHandler gsoap-handler
	SOAPLibrary GSOAP_CALC_SERVER	# this system-level logical name points to the executable
</Location>
#===============================
#	service: current-time demo
#	logical: $def/sys gsoap_current_time CSMIS$ROOT3:[DVLP._GSOAP_CURRENT_TIME]GSOAP_CURRENT_TIME.EXE 
#
<Location /gsoap_current_time>		# lowercase name (also enable in SSL.CONF if HTTPS support is desired)
	SetHandler gsoap-handler
	SOAPLibrary GSOAP_CURRENT_TIME	# this system-level logical name points to the executable
</Location>
#===============================
file: [.conf]ssl.conf
<VirtualHost 142.180.39.16:443>
#===============================
#	service: calc service demo
#	logical: $def/sys gsoap_calc_server CSMIS$ROOT3:[DVLP._GSOAP_SAMPLES.CALC-NSR]calcserver.EXE 
#
<Location /gsoap_calc_server>		# lowercase name (also enable in HTTPD.CONF if HTTP support is desired)
	SetHandler gsoap-handler
	SOAPLibrary GSOAP_CALC_SERVER	# this system-level logical name points to the executable
</Location>
#===============================
#
#	service: current-time demo (not used here)
#	logical: $def/sys gsoap_current_time CSMIS$ROOT3:[DVLP._GSOAP_CURRENT_TIME]GSOAP_CURRENT_TIME.EXE
#
#<Location /gsoap_current_time>		# lowercase name (also enable in HTTPD.CONF if HTTP support is desired)
#	SetHandler gsoap-handler
#	SOAPLibrary GSOAP_CURRENT_TIME	# this system-level logical name points to the executable
#</Location>
#===============================
</VirtualHost>

My gSOAP Application for OpenVMS

Overview (Implements the PUSH-PUSH model)

Note: Due to a corporate security directive, all transmissions are encrypted via OpenSSL.

Flow #1 (Company 1 to 2)

		   Company #1				   Company #2
		   SOAP Client				   SOAP Server
+-------+	+---------------+			+---------------+	+------+
| Human	+------>| create ticket +- HTTP POST ---------->| Queue Msg/Job +------>| db   |
| Event	|	| update ticket |<-------- Status: 200 -+ HTTP response |	| code |
+-------+	+---------------+			+---------------+	+--+---+
		   SOAP Server				   SOAP Client		   |
		+---------------+			+---------------+	   |
		| Queue Msg/Job	|<---------- HTTP POST -+ Action: Reply	|<---------+
		| HTTP Response +- Status: 200 -------->| within 60 sec	|
		+---------------+			+---------------+

Flow #2 (Company 2 to 1)

		   Company #1				   Company #2
		   SOAP Server				   SOAP Client
 +------+	+---------------+			+---------------+	+-------+
 | db   |<------+ Queue Msg/Job |<---------- HTTP POST -+ Update Ticket |<------+ Human |
 | code |	| HTTP response +- Status: 200 -------->| Close Ticket	|	| Event	|
 +--+---+	+---------------+			+---------------+	+-------+
    |		   SOAP Client				   SOAP Server
    |		+---------------+			+---------------+
    +---------->| Action: Reply	+- HTTP POST ---------->| Queue Msg/Job	|
		| within 60 sec |<-------- Status: 200 -+ HTTP Response	|
		+---------------+			+---------------+

gSOAP Caveats (all platforms)

One of the things I like about gSOAP is that it is constantly being improved then rereleased. However, this caused me to waste an hour (totally my own fault) when I casually attempted to use demo client program calcclient.c from gSOAP-2.8.15 with demo server program calcserver.c from gSOAP-2.8.3 which caused the client to always display a result of '0' with no error messages. This was caused by the fact that file calc.h had changed between releases which affected generated code, wsdl, and data.

ver calc.h calc_add_req.xml
2.8.3
//gsoap ns service name:        calc
//gsoap ns service style:       document
//gsoap ns service encoding:    literal
//gsoap ns service namespace:   http://websrv.cs.fsu.edu/~engelen/calc.wsdl
//gsoap ns service location:    http://websrv.cs.fsu.edu/~engelen/calcserver.cgi

//gsoap ns schema namespace: urn:calc

int ns__add(double a, double b, double *result);
int ns__sub(double a, double b, double *result);
int ns__mul(double a, double b, double *result);
int ns__div(double a, double b, double *result);
int ns__pow(double a, double b, double *result);
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:ns="urn:calc">
 <SOAP-ENV:Body>
  <ns:add>
   <ns:a>0.0</ns:a>
   <ns:b>0.0</ns:b>
  </ns:add>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
2.8.15
//gsoap ns service name:        calc Simple calculator service
//gsoap ns service protocol:    SOAP
//gsoap ns service style:       rpc
//gsoap ns service encoding:    encoded
//gsoap ns service namespace:   http://websrv.cs.fsu.edu/~engelen/calc.wsdl
//gsoap ns service location:    http://websrv.cs.fsu.edu/~engelen/calcserver.cgi

//gsoap ns schema namespace:    urn:calc

//gsoap ns service method-documentation: add Sums two values
int ns__add(double a, double b, double *result);

//gsoap ns service method-documentation: sub Subtracts two values
int ns__sub(double a, double b, double *result);

//gsoap ns service method-documentation: mul Multiplies two values
int ns__mul(double a, double b, double *result);

//gsoap ns service method-documentation: div Divides two values
int ns__div(double a, double b, double *result);

//gsoap ns service method-documentation: pow Raises a to b
int ns__pow(double a, double b, double *result);
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:ns="urn:calc">
 <SOAP-ENV:Body 
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <ns:add>
   <a>0.0</a>
   <b>0.0</b>
  </ns:add>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>








To diagnose problems (without resorting to a packet sniffer) you might wish to insert these 3-4 lines into your server code

	soap_init(&soap);				// initialize (this line will already be present)
	soap_set_recv_logfile(&soap, "recv.log");	// -+
	soap_set_sent_logfile(&soap, "sent.log");	// -+- usually written to the Apache logging area
	soap_set_test_logfile(&soap, "test.log");	// -+
	soap_set_mode(&soap, SOAP_XML_STRICT);		// tell gSOAP to reject bad SOAP transactions (will throw an error)
	soap_serve(&soap);				// serve as a CGI application (this line will already be present)

Links:


Back to OpenVMS
Back to Apache Notes
Back to Home
Neil Rieck
Kitchener - Waterloo - Cambridge, Ontario, Canada.