axis-c-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From alebu <ale...@gmail.com>
Subject Problems with WSDL2C generated code - ADB deserialize fails perhaps
Date Fri, 18 Apr 2008 10:27:59 GMT
Hi, I am trying to use WSDL2C utility to create stab for my web-service, but
at this moment can't undersand whats wrong:
Code generator works incorrectly or my provided WSDL is wrong in some way.
In general, when I created very simple web-service which gets and returns
string from http://www.w3.org/2001/XMLSchema NS
then everything works almost fine. The little problem occurs in testing. I
am using SoapUI application for testing WS and when I give my WSDL to it
( the same I use to generate WS stabs and skeleton with WSDL2C). So, SoapUI
wraps body data with WS operation name and WS in this case
cant parse data correctly. I removed operation tag and everything worked
fine. But it is only in simple cases where primitive types are used,
real problems occurs when I am trying to use complex types. WSDL looks like:


<wsdl:definitions targetNamespace="http://example.com/myws"
    xmlns:tns="http://example.com/myws"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <wsdl:types>
        <schema targetNamespace="http://example.com/myws"
            xmlns="http://www.w3.org/2001/XMLSchema">
            <complexType name="field_type">
                <sequence>
                    <element name="type" type="xsd:string"/>
                    <element name="name" type="xsd:string"/>
                    <element name="value" type="xsd:string"/>
                </sequence>
            </complexType>
            <complexType name="serve_req_type">
                <sequence>
                    <element name="param" type="tns:field_type"/>
                </sequence>
            </complexType>
            <complexType name="serve_resp_type">
                <sequence>
                    <element name="param" type="xsd:string"/>
                </sequence>
            </complexType>
        </schema>
    </wsdl:types>


    <wsdl:message name="serve_req_msg">
        <wsdl:part name="value" type="tns:serve_req_type"/>
    </wsdl:message>

    <wsdl:message name="serve_resp_msg">
        <wsdl:part name="value" type="tns:serve_resp_type"/>
    </wsdl:message>

    <wsdl:portType name="myws_port">
        <wsdl:operation name="serve">
            <wsdl:input message="tns:serve_req_msg" name="serve_req" />
            <wsdl:output message="tns:serve_resp_msg" name="serve_resp" />
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="myws_binding" type="tns:myws_port">
        <soap:binding style="rpc" transport="
http://schemas.xmlsoap.org/soap/http"/>

        <wsdl:operation name="serve">
            <soap:operation soapAction="http://example.com/myws/serve"/>
            <wsdl:input>
                <soap:body namespace="http://example.com/myws"
use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body namespace="http://example.com/myws"
use="literal"/>
            </wsdl:output>
        </wsdl:operation>

    </wsdl:binding>

    <wsdl:service name="myws">
        <wsdl:port binding="tns:myws_binding" name="myws_port">
            <soap:address location="
http://localhost:9090/axis2/services/myws"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

for generating code i use command line like:
${AXIS2C_HOME}/bin/WSDL2C.sh -o ${CODE_DST_DIR} -wv 1.1 -l c -ss -sd -f -t
-ssi -or -uri ${WSDL_FILE}

In generated axis2_skel_myws.c file I modified axis2_skel_myws_serve
function to inform about what happening
like this:

adb_serveResponse_t* axis2_skel_myws_serve(
        const axutil_env_t *env,
        adb_serve_t* serve
){
    printf( "axis2_skel_myws_serve:start\n" );

    if( serve == NULL ){
        printf( "axis2_skel_myws_serve: serve is NULL\n" );
        return NULL;
    }

    adb_serve_req_type_t* serve_req = adb_serve_get_value( serve, env );

    if( serve_req == NULL ){
        //ERROR!
        printf( "axis2_skel_myws_serve: serve_req is NULL\n" );
        return NULL;
    }

    adb_field_type_t* field = adb_serve_req_type_get_param( serve_req, env
);

    if( field == NULL ){
        printf( "axis2_skel_myws_serve: field is NULL\n" );
        return NULL;
    }

    printf( "Type is %s\n", adb_field_type_get_type( field, env ));
    printf( "Name is %s\n", adb_field_type_get_name( field, env ));
    printf( "Value is %s\n", adb_field_type_get_value( field, env ));

    // creating response

    adb_serve_resp_type_t* resp = adb_serve_resp_type_create( env );
    adb_serve_resp_type_set_param( resp, env, "fake response" );

    adb_serveResponse_t* rval = adb_serveResponse_create( env );
    adb_serveResponse_set_value( rval, env, resp );

    return rval;
}

And then I loaded WSDL into SoapUI and it formed me test request like this:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:myws="http://example.com/myws">
   <soapenv:Header/>
   <soapenv:Body>
         <value>
            <param>
               <type>string</type>
               <name>par1</name>
               <value>par1 value</value>
            </param>
         </value>
   </soapenv:Body>
</soapenv:Envelope>

Request to Axis looks like (SoapUI http log):

Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "POST /axis2/services/myws
HTTP/1.1[\r][\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "Content-Type:
text/xml;charset=UTF-8[\r][\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "SOAPAction: "
http://example.com/myws/serve"[\r][\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "User-Agent: Jakarta
Commons-HttpClient/3.0.1[\r][\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "Host: localhost:9090[\r][\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "Content-Length: 377[\r][\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "[\r][\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "<soapenv:Envelope xmlns:soapenv="
http://schemas.xmlsoap.org/soap/envelope/" xmlns:myws="
http://example.com/myws">[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "   <soapenv:Header/>[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "   <soapenv:Body>[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "         <value>[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "            <param>[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "
<type>string</type>[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "               <name>par1</name>[\n]"

Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "               <value>par1
value</value>[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "            </param>[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "         </value>[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "   </soapenv:Body>[\n]"
Sun Mar 23 17:15:53 EET 2008:DEBUG:>> "</soapenv:Envelope>[\n]"

>From axis console is obvious that adb_serve_get_value returns NULL and as I
understand it is incorrect behavior.
Maybe I did something wrong, can someone catch an eye on my code and
probably help with whatever problem it is?

Mime
View raw message