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?
