如何处理pythonsoap模块zeep中的complexType参数?

2024-10-01 19:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

Zeep文档示例:

from zeep import Client

client = Client('http://my-enterprise-endpoint.com')
client.service.submit_order(user_id=1, order={
    'number': '1234',
    'price': 99,
})

我的用例:

我想调用需要参数“findCriteria”的webservice

示例:

^{pr2}$

调用服务:

打印client.service.GetCount(findCriteria=findCriteria)

这是创建的XML:

在 在

<soap-env:Body>
    <ns1:GetCount>
      <ns1:findCriteria/>
    </ns1:GetCount>
  </soap-env:Body>
</soap-env:Envelope>

问题:

尽管服务返回计数,但不应用条件。在

当我向服务提供原始XML负载时,结果是正常的。在

问题出在<ns1:findCriteria/>部分。在

对于每个列,应该创建一个Criteria元素。在

WSDL上grep GetCount的结果:

<s:element name="GetCount">
      <s:element name="GetCountResponse">
            <s:element minOccurs="1" maxOccurs="1" name="GetCountResult" type="s:int" />
  <wsdl:message name="GetCountSoapIn">
    <wsdl:part name="parameters" element="tns:GetCount" />
  <wsdl:message name="GetCountSoapOut">
    <wsdl:part name="parameters" element="tns:GetCountResponse" />
    <wsdl:operation name="GetCount">
      <wsdl:input message="tns:GetCountSoapIn" />
      <wsdl:output message="tns:GetCountSoapOut" />
    <wsdl:operation name="GetCount">
      <soap:operation soapAction="http://<server>/webservices/SupportCall/GetCount" style="document" />
    <wsdl:operation name="GetCount">
      <soap12:operation soapAction="http://<server>/webservices/SupportCall/GetCount" style="document" />

Tags: nameenvclientwebhttpmessageserviceelement
3条回答

使用以下命令检查wsdl: python -mzeep <wsdl>

您将在输出中找到服务的详细信息:ns1:GetCount(FindCriteria:findCriteria)

基于上述检验输出的样本代码:

find_criteria_type = client.get_type('ns1:findCriteria')
find_criteria = find_criteria_type()
client.service.GetCount(FindCriteria=find_criteria)

如果XML是这样的:

^{pr2}$

创建对象时需要传递参数:

find_criteria = find_criteria_type(param1=val1, param2=val2)

当我运行以下命令时:

GET_TYPE_PutPropDataMappings=CPRManager_url.get_type('ns1:PropDataMapperSetup')
print(GET_TYPE_PutPropDataMappings)
SET_Values_PutPropDataMappings=GET_TYPE_PutPropDataMappings(ActingUserId='388153')
print(SET_Values_PutPropDataMappings)

结果是:

^{pr2}$

看起来是对的。但是,当我使用以下命令运行获取值的请求时:

Response_PutPropDataMappings=CPRManager_url.service.PutPropDataMappings(propDataMapperSetup=SET_Values_PutPropDataMappings)
print(Response_PutPropDataMappings)

我获取:-在

{
    'ErrorCodes': None,
    'ErrorMessages': {
        'string': [
            'Invalid acting userid :0'
        ]
    },
    'WarningMessages': None,
    'WasSuccessful': None
}

与通过相同:

Response_PutPropDataMappings=CPRManager_url.service.PutPropDataMappings(propDataMapperSetup)
print(Response_PutPropDataMappings)

我遇到了一个类似的问题,我设法解决了它,但是为了帮助您,我需要一个正确的XML示例(它应该是什么样子),或者至少需要一个使用SoapUI生成的默认请求。在

同时,下面的代码可能会对您有所帮助: 这里复杂的参数是凭证,它包括两个登录项,登录名和域。在

<soap-env:Envelope xmlns:ns1="http://xml.kamsoft.pl/ws/kaas/login_types" 
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
  <soap-env:Body>
    <ns1:login>
      <ns1:credentials>
        <ns1:item>
          <ns1:name>login</ns1:name>
          <ns1:value>
             <ns1:stringValue>login_here</ns1:stringValue>
          </ns1:value>
        </ns1:item>
        <ns1:item>
           <ns1:name>domain</ns1:name>
           <ns1:value>
             <ns1:stringValue>domain_here</ns1:stringValue>
           </ns1:value>
        </ns1:item>
      </ns1:credentials>
      <ns1:password>password_here</ns1:password>
    </ns1:login>
  </soap-env:Body>
</soap-env:Envelope>

下面是生成此XML的代码:

^{pr2}$

相关问题 更多 >

    热门问题