使用Python中的SUDS通过SOAP Webservice访问联邦数据

时间:2017-03-27 10:14:29

标签: python xml web-services soap suds

我正在尝试访问瑞士联邦政府商业登记处的网络服务(https://www.bfs.admin.ch/bfs/de/home/register/unternehmensregister/unternehmens-identifikationsnummer/uid-register/uid-schnittstellen.assetdetail.1760903.html

然而,他们的文档非常复杂和奇怪,我不知道如何构建它的工作请求。

我对REST API比较熟悉,但SOAP对我来说是新的。

使用SoapUI我设法建立了一个工作请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"    xmlns:uid="http://www.uid.admin.ch/xmlns/uid-wse" xmlns:ns="http://www.ech.ch/xmlns/eCH-0108-f/3" xmlns:ns1="http://www.ech.ch/xmlns/eCH-0098-f/3" xmlns:ns2="http://www.ech.ch/xmlns/eCH-0097-f/2" xmlns:ns3="http://www.ech.ch/xmlns/eCH-0046-f/3" xmlns:ns4="http://www.ech.ch/xmlns/eCH-0044-f/4" xmlns:ns5="http://www.ech.ch/xmlns/eCH-0010-f/6" xmlns:ns6="http://www.ech.ch/xmlns/eCH-0007-f/6">
<soapenv:Header/>
  <soapenv:Body>
    <uid:Search>
      <uid:searchParameters>
        <ns:organisation>
          <ns1:organisationIdentification>
              <ns2:organisationName>Beekeeper</ns2:organisationName>
           </ns1:organisationIdentification>
        </ns:organisation>
     </uid:searchParameters>
  </uid:Search>
</soapenv:Body>
</soapenv:Envelope>

但是我没能在Python中实现这个请求。无论我查找什么教程,我都会找到诸如

之类的内容
 request_data = client.factory.create('s1:CityWeatherRequest')
 request_data.City = "Stockholm"

如上所述构建请求的方法是什么?

如何为SOAP创建嵌套请求?

1 个答案:

答案 0 :(得分:0)

您应该查看pyxb

当您基于wsdl架构或xsd文件构建Python绑定时,您可以执行以下代码来发出请求。 wsld显示了您的行为。

from pyxb.utils.six.moves.urllib import request as urllib_request
import pyxb.bundles.wssplat.soap11 as soapenv

# Create a SOAP envelope from XML
myenv = soapenv.Envelope(soapenv.Body(myxmlreq))

# Create URL, headers and body for the HTTP request
url="http://www.test.com"
headers = {'Content-Type': 'text/xml;charset=UTF-8',
           'Accept-Encoding': 'gzip,deflate',
           'SOAPAction': "http://test.com/API/Action", # See documentation to learn about the actions
           'Connection':'close'} # set what your server accepts
body = myenv.toxml("utf-8")

# Create the request, send it and receive the response as XML
uri = urllib_request.Request(url,data=body,headers=headers)
rxml = urllib_request.urlopen(uri).read() # This is the response XML