Loading ...
Sorry, an error occurred while loading the content.

1899Document SOAP as Opposed to RPC

Expand Messages
  • jgubler
    Oct 3, 2002
    • 0 Attachment
      The application I am working on really calls for document-based as
      opposed to rpc-based SOAP. I feel as if SOAP::Lite was not really
      written with this approach in mind. Still, I like many features of
      SOAP::Lite and I am hoping that there is a way to accomplish my
      objectives without switching to another toolkit.

      Suppose I want my client to submit an XML document to a web service
      for processing. I think I have a handle on this side. I construct the
      desired XML data and then use SOAP::Data->type('xml' => $xmldata) to
      get the job done. There may be some namespace issues here to work
      out, but I think that's close.

      On the server-side, I am less certain of how to proceed. Let's say
      that I have created the following server code:


      use SOAP::Transport::HTTP;

      -> dispatch_to('Services')
      -> handle;

      package Services;

      sub MyGroceries

      My client can then invoke this with something like:


      use SOAP::Lite;

      my $soap = SOAP::Lite
      -> uri('urn:myservice')
      -> proxy('http://myserver.com/SOAP/services.cgi');


      $soap->MyGroceries(SOAP::Data->type('xml' => $groceries_xml));

      The question is, what is the exact nature of the arguments that will
      be received by Services::MyGroceries() on the server side? It looks
      to me like it's getting the class name as the first argument and a
      hash reference as the second. The hash appears to contain the XML
      elements as keys, with their content as values, organized in a
      hierarchical fashion. If the XML contains anything moderately
      complicated, such as element attributes, this hash fails to reflect
      those features.

      For example, suppose the client passed the following simple XML:

      <Name type="simpleName">Cheerios</Name>

      The hash passed to Services::MyGroceries() would look something like:

      'Item' => {},
      'Name' => 'Cheerios'

      What happened to the attribute on the 'Name' element? This clearly
      will not do.

      My problems would be solved if I could simply access the raw SOAP
      body element from within the MyGroceries() method. At that point, I
      would just grab the whole XML document as a string and feed it into
      my favorite parser for processing. Does anyone know how to do this?

      Is there another approach I should be considering? Please don't
      recommend RPC SOAP.