使用Python请求发送SOAP请求


77

是否可以使用Python的requests库发送SOAP请求?



不应该用泡沫;
Deepankar Bajpeyi

@DeepankarBajpeyi为什么不呢?这是唯一适合该工作的工具。
伊恩·斯台普顿·科尔达斯科

1
您可以传递requests.Sessionzeep
OrangeDog

@IanStapletonCordasco甚至在2013年泡沫都死了。
OrangeDog

Answers:


156

确实有可能。

这是一个使用普通请求lib调用Weather SOAP Service的示例:

import requests
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
#headers = {'content-type': 'application/soap+xml'}
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
         <SOAP-ENV:Envelope xmlns:ns0="http://ws.cdyne.com/WeatherWS/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
            <SOAP-ENV:Header/>
              <ns1:Body><ns0:GetWeatherInformation/></ns1:Body>
         </SOAP-ENV:Envelope>"""

response = requests.post(url,data=body,headers=headers)
print response.content

一些注意事项:

  • 标头很重要。没有正确的标头,大多数SOAP请求将无法工作。application/soap+xml可能是更正确使用的标头(但weatherservice更喜欢text/xml
  • 这将以xml字符串形式返回响应-然后,您需要解析该xml。
  • 为简单起见,我以纯文本形式包含了该请求。但是最佳实践是将其存储为模板,然后您可以使用jinja2加载它(例如),并传入变量。

例如:

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('soaprequests/WeatherSericeRequest.xml')
body = template.render()

有人提到了肥皂水库。Suds可能是与SOAP交互的更正确的方式,但是我经常发现,当您的WDSL格式不正确时,它会有些恐慌(当您与一家仍与之打交道的机构打交道时,TBH的可能性更大。使用SOAP;))。

您可以像这样用肥皂水做上面的事情:

from suds.client import Client
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
client = Client(url)
print client ## shows the details of this service

result = client.service.GetWeatherInformation() 
print result 

注意:使用泡沫时,您几乎总是需要使用医生

最后,调试SOAP有一些好处。TCPdump是您的朋友。在Mac上,您可以像这样运行TCPdump:

sudo tcpdump -As 0 

这有助于检查实际通过网络的请求。

以上两个代码段也可以作为要点提供:


2
如果服务要求用户名和密码怎么办?在哪里注意他们?
奥斯卡(Oskars)2016年

suds代码片段现在给出“ suds.transport.TransportError:HTTP错误500:内部服务器错误”。好像服务器已关闭。
路易

3
@ toast38coza wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL- >“ / WeatherWS”应用程序中的服务器错误。请更新示例。
Wlad

1
@ toast38coza在上面的请求示例中,哪里可以获取标题和主体变量的信息?
Wlad

Suds文档不再在fedorahosted.org上可用。这是指向Wayback Machine上文档快照的链接
克里斯蒂安·朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.