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



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

我遵循这里的第一个示例。我也参考了Zeep文档。

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

这是我的代码:

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 模块可以做到这一点?

两个月前我发布了一个类似的问题,但在找到解决方法后继续前进。然而,我一直回到这个问题,因为它真的困扰着我。所以如果有人能帮助我,我将不胜感激!

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

如果您参考文档,您会发现XML元素,如Request_ReferencesResponse_Filter等。由于您没有传入任何元素,因此它只是生成一个空的 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参数。

最新更新