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