sending a handmade SOAP request

Bernard bernard.chhun at gmail.com
Thu Jan 31 16:00:03 EST 2008


On 31 jan, 15:23, Van Gale <vang... at gmail.com> wrote:
> Yes, it's quite easy to SOAP by hand.
>
> I use Oren Tirosh's ElementBuilder class (on top of lxml instead of
> ElementTree) to build the SOAP request and the xpath capabilities in lxml
> to pull out the data I need from the response.
>
> http://www.tothink.com/python/ElementBuilder/http://codespeak.net/lxml/
>
> An incomplete example for contructing a request looks something like this:
>
> body = Element('soap:Envelope',
>          { 'xmlns:soap': nss['soap']},
>          Element('soap:Header'), Element('soap:Body',
>            { 'xmlns:msgs': nss['msgs'] },
>            Element('msgs:login',
>              Element('msgs:passport',
>                { 'xmlns:core': nss['core'] },
>                  Element('core:password', password),
>                  Element('core:account', account)))))
>
> I use httplib2 for sending the HTTP requests:
>
> http://code.google.com/p/httplib2/
>
> Incomplete example:
>
> headers['SOAPAction'] = action
> headers['Content-length'] = str(len(etree.tostring(body)))
> response, content = self._client.request(
>    self.ns_uri, "POST",
>    body=etree.tostring(body), headers=self._headers)
> if response.status == 500 and not \
>     (response["content-type"].startswith("text/xml") and \
>     len(content) > 0):
>         raise HTTPError(response.status, content)
> if response.status not in (200, 500):
>     raise HTTPError(response.status, content)
> doc = etree.parse(StringIO(content))
> if response.status == 500:
>     faultstring = doc.findtext(".//faultstring")
>     raise HTTPError(response.status, faultstring)
>
> Now it's just a matter of using xpath expressions to dig into the "doc"
> structure for the bits you need.

oh my that is quite the handy answer Van Gal! I'll try it out right
now. thanks a bunch man!



More information about the Python-list mailing list