Anne,

Thanks for the correction.

Section 3.5 of WSDL 1.1 (http://www.w3.org/TR/wsdl.html#_soap:body) specifies "reader 
makes right" versus "writer makes right" for certain scenarios.  Given, as you have 
pointed out, that rpc requires the wrapper that will not be specified in the schema 
even when concrete types are forced (using literal), I do not see how the service 
described below can require a particular namespacing of the parameters (writer makes 
right) unless the operation binding is doc/lit.  What am I missing?

Scott Nichol

Do not send e-mail directly to this e-mail address,
because it is filtered to accept only mail from
specific mail lists.

----- Original Message ----- 
From: "Anne Thomas Manes" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, April 09, 2004 2:31 PM
Subject: Re: Requestparameters 


Actually, the elementFormDefault attribute doesn't apply to RPC-style messages, 
because you don't have a schema that defines either the wrapper element (the method 
name) or the parameter elements. These elements are automatically generated by the 
SOAP runtime. The SOAP 1.1 specification doesn't specify what namespace the parameter 
elements should belong to.

Per the WS-I Basic Profile (which defines RPC/Literal, but not RPC/Encoded), the 
parameter elements should be in no namespace. See:

http://www.ws-i.org/Profiles/Basic/2003-08/BasicProfile-1.0a.html#refinement35268960


5.6.20 Namespace for Part Accessors
For rpc-literal SOAP messages, WSDL 1.1 is not clear what namespace, if any, the 
accessor elements for parameters and return value are a part of. Different 
implementations make different choices, leading to interoperability problems. 

R2735 A MESSAGE described with an rpc-literal binding MUST place the part accessor 
elements for parameters and return value in no namespace. 

Settling on one alternative is crucial to achieving interoperability. The Profile 
places the part accessor elements in no namespace as doing so is simple, covers all 
cases, and does not lead to logical inconsistency. 


At 02:16 PM 4/9/2004, you wrote:

  This is an aspect of XML that was poorly defined until the XML Schema spec.  That 
spec defines an attribute named 'elementFormDefault', which can have values 
'qualified' and 'unqualified'.  With a value of 'unqualified', the XML looks like the 
Apache SOAP payload you show below.  That the MS SOAP service you are working with 
wants namespaces for each element implies that the WSDL for the service contains a 
schema that specifies the 'qualified' form.  (Note: elementFormDefault is commonly 
used to set global behavior, i.e. behavior for all complexTypes in a schema.  I think 
there is also an elementForm attribute that affects behavior for a single complexType.)

  In the current nightly build of Apache SOAP, the SOAPContext class has a method

       public void setQualifyElements(boolean qualifyElements)

  that allows you to specify whether elements should be qualified.  If you use that 
code base and call this method with a parameter of true, you should be the behavior 
you desire.

      ...
      call.setSOAPMappingRegistry(Smr);
      call.getContext().setQualifyElements(true);
      ...

  Scott Nichol

  Do not send e-mail directly to this e-mail address,
  because it is filtered to accept only mail from
  specific mail lists.
  ----- Original Message ----- 
  From: "jer ." <[EMAIL PROTECTED]>
  To: <[EMAIL PROTECTED]>
  Sent: Friday, April 09, 2004 1:19 PM
  Subject: Requestparameters 


  Hello !

  Could someone please explain to me the following ? Please !!!

  All the request examples from Apache SOAP use different namespaces for the 
  first subelement
  to the SOAP body and the parameter elements.

  My SOAP request sent to a MS SOAP server failes due to the fact that SOAP 
  parameters having another
  namespace then the first SOAPbody subelement. Renaming the parameters with 
  the prefix "ns1:"
  makes the requests work so I know thats where the problem is.

  According to the sample requests on the w3c forum
  ( see. http://www.w3.org/TR/2003/REC-soap12-part0-20030624/#L1165 ) the same 
  namespace is used
  for all SOAP parameter elements in the same body subelement so from my point 
  of view it looks
  like Apache SOAP is making non standard requests !?!??

  I have even seen some samples of requests from Axis that shows the same 
  behavior ?!?

  See below how the "Login" element doesn't use the qualified name 
  "ns1:Login"....

  My request from Apache SOAP
  ---------------------------

  POST http://www.yaddayadday.com/webservices/customer/customer.asmx HTTP/1.0
  Host: www.yaddayadday.com:80
  Content-Type: text/xml; charset=utf-8
  Content-Length: 554
  SOAPAction: 
  "http://www.yaddayadday.com/webservices/customer/RequestProductList";

  <?xml version='1.0' encoding='UTF-8'?>
  <SOAP-ENV:Envelope 
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
    <SOAP-ENV:Body>
      <ns1:RequestProductList 
  xmlns:ns1="http://www.yaddayadday.com/webservices/customer"; 
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";>
         <Login xsi:type="xsd:string">USERID</Login>
         <Password xsi:type="xsd:string">PASSWORD</Password>
      </ns1:RequestProductList>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>


  What it should look like ( According to the MS server and me...)
  -----------------------------------------------------------------

  POST http://www.yaddayadday.com/webservices/customer/customer.asmx HTTP/1.0
  Host: www.yaddayadday.com:80
  Content-Type: text/xml; charset=utf-8
  Content-Length: 554
  SOAPAction: 
  "http://www.yaddayadday.com/webservices/customer/RequestProductList";

  <?xml version='1.0' encoding='UTF-8'?>
  <SOAP-ENV:Envelope 
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
    <SOAP-ENV:Body>
      <ns1:RequestProductList 
  xmlns:ns1="http://www.yaddayadday.com/webservices/customer"; 
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";>
         <ns1:Login xsi:type="xsd:string">USERID</ns1:Login>
         <ns1:Password xsi:type="xsd:string">PASSWORD</ns1:Password>
      </ns1:RequestProductList>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>


  Below is my code ( that looks like all the samples I found around).
  -------------------------------------------------------------------

  URL url = new 
  URL("http://www.yaddayadday.com/webservices/customer/customer.asmx";);

  Call call = new Call();
  call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
  call.setTargetObjectURI("http://www.yaddayadday.com/webservices/customer";);
  call.setMethodName("RequestProductList");
  call.setSOAPMappingRegistry(Smr);

  Vector params = new Vector();

  params.add(new Parameter("Login",String.class,"USERID",null) );
  params.add(new Parameter("Password",String.class,"PASSWORD",null) );

  call.setParams(params);

  resp = 
  
call.invoke(url,"http://www.yaddayadday.com/webservices/customer/RequestProductList";);


  Conclusion
  ----------

  So my question is if Apache SOAP is using a non standard implementation or 
  if I am doing something wrong
  in my code/assumption. Anyone know how to solve this without rewriting the 
  SOAP Apache implementation or the service ?

  /Thanks, Jer

  _________________________________________________________________
  Auktioner: Tj�na en hacka p� gamla prylar http://tradera.msn.se
~~~~~~~~~~~~~~~~~~
Anne Thomas Manes
VP & Research Director
Burton Group 

Reply via email to