SOAP - ACL creates multiple soap-env:Header tags

Chaitanya Gupta <[email protected]> Mon, 16 Oct 2006 21:28:05 +0530
Newsgroups gmane.lisp.allegro
Message-ID <[email protected]>
Hi,

Here's another question related to ACL's SOAP API. I want a couple of 
headers to be included in a SOAP request like this -

<SOAP-ENV:Header>
   <h1>
     <h1-sub xsi:type='xsd:string'>abc</h1-sub>
   </h1>
   <h2>
     <h2-sub xsi:type='xsd:string'>def</h2-sub>
   </h2>
</SOAP-ENV:Header>


However, when I try to do this using the following code -

(defun test-session ()
 (let* ((conn (soap-message-client :url *some-url*
                   :lisp-package :keyword))
    (head1 (make-soap-header conn
                 '(:element :|h1| (:complex (:seq (:element "h1-sub" 
xsd:|string|))))
                 :|h1-sub| "abc"))
    (head2 (make-soap-header conn
                 '(:element :|h2| (:complex (:seq (:element "h2-sub" 
xsd:|string|))))
                 :|h2-sub| "def")))
   (soap-add-header conn head1)
   (soap-add-header conn head2)
   (call-soap-method conn
             '(:element "body-el" (:simple nil)))))

the following SOAP request is created -

<?xml version="1.0"?>
<SOAP-ENV:Envelope
   SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/'
   xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'
   >
 <SOAP-ENV:Header>
   <h1>
     <h1-sub xsi:type='xsd:string'>abc
     </h1-sub>
   </h1>
 </SOAP-ENV:Header>
 <SOAP-ENV:Header>
   <h2>
     <h2-sub xsi:type='xsd:string'>def
     </h2-sub>
   </h2>
 </SOAP-ENV:Header>
 <SOAP-ENV:Body>
   <body-el/></SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Note the twin SOAP-ENV:Header tags. I don't want that. I just want <h1> 
and <h2> inside the same Header tag.
I tried passing a (:complex (:seq (:element ...) ...)) form as second 
argument to make-soap-header (just like for call-soap-method when you 
need multiple elements in the SOAP Body), but then I got the following 
error -
:COMPLEX fell through a ECASE form.  The valid cases were :ANY and
:ELEMENT

How can I solve this problem? I am using ACL version 8.0.

Thanks,
Chaitanya