如何使用Zeep为SOAP Web服务生成完整的XML模板

时间:2019-12-21 02:05:38

标签: python xml web-services soap zeep

您知道SOAPUI如何为SOAP Web服务生成完整的XML模板吗?我想这样做,但是要使用Python模块Zeep。

我正在关注here中的第一个示例。我也指的是Zeep Documentation

注意:我使用的Web服务是面向公众的Workday Web服务,没有客户数据。更多信息是here

这是我的代码:

wsdl = "https://community.workday.com/sites/default/files/file-hosting/productionapi/Resource_Management/v33.1/Resource_Management.wsdl"
client = Client(wsdl)

message = client.create_message(client.service, "Get_Purchase_Items")

tree = ET.ElementTree(message)

xml = tree.write('test.xml',pretty_print=True)

问题:这不会像SOAPUI那样创建完整的XML模板。

这是我的代码创建的内容:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
  <soap-env:Body>
    <ns0:Get_Purchase_Items_Request xmlns:ns0="urn:com.workday/bsvc"/>
  </soap-env:Body>
</soap-env:Envelope>

这是SOAPUI创建的(也是我从zeep中寻找的):

   <soapenv:Header>
      <bsvc:Workday_Common_Header>
         <!--Optional:-->
         <bsvc:Include_Reference_Descriptors_In_Response>?</bsvc:Include_Reference_Descriptors_In_Response>
      </bsvc:Workday_Common_Header>
   </soapenv:Header>
   <soapenv:Body>
      <bsvc:Get_Purchase_Items_Request bsvc:version="?">
         <!--You have a CHOICE of the next 2 items at this level-->
         <!--Optional:-->
         <bsvc:Request_References>
            <!--1 or more repetitions:-->
            <bsvc:Purchase_Item_Reference bsvc:Descriptor="?">
               <!--Zero or more repetitions:-->
               <bsvc:ID bsvc:type="?">?</bsvc:ID>
            </bsvc:Purchase_Item_Reference>
         </bsvc:Request_References>
         <!--Optional:-->
         <bsvc:Request_Criteria>
            <!--Zero or more repetitions:-->
            <bsvc:Supplier_Reference bsvc:Descriptor="?">
               <!--Zero or more repetitions:-->
               <bsvc:ID bsvc:type="?">?</bsvc:ID>
            </bsvc:Supplier_Reference>
            <!--Zero or more repetitions:-->
            <bsvc:Supplier_Contract_Reference bsvc:Descriptor="?">
               <!--Zero or more repetitions:-->
               <bsvc:ID bsvc:type="?">?</bsvc:ID>
            </bsvc:Supplier_Contract_Reference>
            <!--Optional:-->
            <bsvc:Return_All_Advanced_Pricing>?</bsvc:Return_All_Advanced_Pricing>
            <!--Optional:-->
            <bsvc:Return_Active_Advanced_Pricing>?</bsvc:Return_Active_Advanced_Pricing>
            <!--Optional:-->
            <bsvc:Exclude_Pricing_Calculated_by_Conversion_Factor>?</bsvc:Exclude_Pricing_Calculated_by_Conversion_Factor>
         </bsvc:Request_Criteria>
         <!--Optional:-->
         <bsvc:Response_Filter>
            <!--Optional:-->
            <bsvc:As_Of_Effective_Date>?</bsvc:As_Of_Effective_Date>
            <!--Optional:-->
            <bsvc:As_Of_Entry_DateTime>?</bsvc:As_Of_Entry_DateTime>
            <!--Optional:-->
            <bsvc:Page>?</bsvc:Page>
            <!--Optional:-->
            <bsvc:Count>?</bsvc:Count>
         </bsvc:Response_Filter>
         <!--Optional:-->
         <bsvc:Response_Group>
            <!--Optional:-->
            <bsvc:Include_Reference>?</bsvc:Include_Reference>
         </bsvc:Response_Group>
      </bsvc:Get_Purchase_Items_Request>
   </soapenv:Body>
</soapenv:Envelope>

问题

  1. 如何使用Zeep生成完整的模板?
  2. 是否有与create_message()不同的功能可以做到这一点?
  3. 是否还有另一个Python模块可以做到这一点?

我发布了similar question two months ago,但是找到解决方法后继续前进。但是,我一直回到这个问题上,因为它确实困扰着我。因此,如果有人可以帮助我,我将非常感激!

1 个答案:

答案 0 :(得分:0)

这里的问题似乎是第三行,您没有将任何参数传递给create_message调用。

如果您参考文档,则会发现诸如Request_ReferencesResponse_Filter等XML元素。由于没有传递任何元素,因此它只是生成一个空XML。

以下示例代码可能适用于您的情况(未经测试):

wsdl = "https://community.workday.com/sites/default/files/file-hosting/productionapi/Resource_Management/v33.1/Resource_Management.wsdl"
client = Client(wsdl)

effective_date = datetime.datetime.strptime('2020-10-01', '%Y-%m-%d')
entry_date = datetime.datetime.strptime('2020-12-01', '%Y-%m-%d')
get_purchase_response_filter_type = client.get_type('ns0:Response_Filter')
response_filter_element = get_purchase_response_filter_type(
                                  As_Of_Effective_Date=effective_date,
                                  As_Of_Entry_DateTime=entry_date 
)
message = client.create_message(client.service, "Get_Purchase_Items", Response_Filter=response_filter_element)
tree = ET.ElementTree(message)
xml = tree.write('test.xml',pretty_print=True)

如果您需要传递任何soap标头,则create_message也接受一个_soapheader参数。