【问题标题】:How to prepare a SOAP request using Zeep?如何使用 Zeep 准备 SOAP 请求?
【发布时间】:2018-12-14 11:25:00
【问题描述】:

我正在尝试使用一个特别神秘的 WSDL SOAP 服务,在这里发布: https://api.business.govt.nz/registry/resource/_system/governance/apimgt/applicationdata/provider/mbiecreator/DiscussionCorrespondence/v1/documentation/files/DiscussionCorrespondence.zip

文档提供了一个示例 Soap 查询:

<soapenv:Envelope xmlns:list="http://www.iponz.govt.nz/XMLSchema/Discussion/List" xmlns:ser="http://www.iponz.govt.nz/services" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
 <soapenv:Header/>
 <soapenv:Body>
  <ser:getDiscussionList>
   <list:Transaction>
    <list:DiscussionTransactionBody>
     <list:TransactionContentDetails>
      <list:TransactionCode>Get Discussion List</list:TransactionCode>
      <list:TransactionData>
       <list:DiscussionList>
        <list:DiscussionListDetails>
         <list:DiscussionCreationDateFrom>2015-02-10</list:DiscussionCreationDateFrom>
         <list:DiscussionCreationDateTo>2015-02-10</list:DiscussionCreationDateTo>
        </list:DiscussionListDetails>
       </list:DiscussionList>
      </list:TransactionData>
     </list:TransactionContentDetails>
    </list:DiscussionTransactionBody>
   </list:Transaction>
  </ser:getDiscussionList>
 </soapenv:Body>
</soapenv:Envelope>

我想做的是使用 Zeep 复制这个原始查询。我该怎么做呢? 谢谢

【问题讨论】:

    标签: python zeep


    【解决方案1】:

    我找到了一个tutorial here,它让我走上了正轨。这是我的代码:

    from zeep import Client, Settings
    
    #Creation of headerArr is excluded as it's not relevant to the xml produced
    headerArr = {}
    settings = Settings(strict=False, xml_huge_tree=True,extra_http_headers=headerArr)
    client = Client('DiscussionCorrespondence/wsdls/DiscussionCorrespondence.wsdl',
        settings=settings)
    requestData = {
        'Transaction': {
            'DiscussionTransactionBody': {
                'TransactionContentDetails': {
                    'TransactionCode':'Get Discussion List',
                    'TransactionData': {
                        'DiscussionList': {
                            'DiscussionListDetails': {
                                    'DiscussionCreationDateFrom':'2015-02-10',
                                    'DiscussionCreationDateTo':'2015-02-10',
                            },
                        },
                    },
                },
            },
        },
    }
    res = client.service.getDiscussionList(**requestData)
    

    发送的美化 XML 请求(来自调试日志)是:

    <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
     <soap-env:Body>
      <ns0:getDiscussionList xmlns:ns0="http://www.iponz.govt.nz/services">
       <ns1:Transaction xmlns:ns1="http://www.iponz.govt.nz/XMLSchema/Discussion/List">
        <ns1:DiscussionTransactionBody>
         <ns1:TransactionContentDetails>
          <ns1:TransactionCode>Get Discussion List</ns1:TransactionCode>
          <ns1:TransactionData>
           <ns1:DiscussionList>
            <ns1:DiscussionListDetails>
             <ns1:DiscussionCreationDateFrom>2015-02-10</ns1:DiscussionCreationDateFrom>
             <ns1:DiscussionCreationDateTo>2015-02-10</ns1:DiscussionCreationDateTo>
            </ns1:DiscussionListDetails>
           </ns1:DiscussionList>
          </ns1:TransactionData>
         </ns1:TransactionContentDetails>
        </ns1:DiscussionTransactionBody>
       </ns1:Transaction>
      </ns0:getDiscussionList>
     </soap-env:Body>
    </soap-env:Envelope>
    

    此 XML 与问题中的不同,但在功能上应该相同。

    【讨论】:

    • 我遇到了同样的问题。在我的例子中,zeep 的有效载荷是 &lt;soap-env:Body&gt;,它应该是 &lt;soap:Body&gt;。它们是等价的吗?它们是否依赖于 SOAP 版本?
    • 据我所知,它们是相同的,但这不是我真正研究过的东西,因为我可以使用返回的结果。还要记住,它们是名称空间前缀,而不是名称空间。它们指的是在元素或其容器之一上定义的 xmlns: 属性(通常在 Envelope 元素上)。
    • "soap-env" 是前缀,实际上是命名空间的别名,是一个URI。只要 URI 是“schemas.xmlsoap.org/soap/envelope”,那么它就有正确的命名空间。
    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多