Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用没有返回消息的Spyne定义SOAP客户端_Python_Soap_Wsdl_Spyne - Fatal编程技术网

Python 使用没有返回消息的Spyne定义SOAP客户端

Python 使用没有返回消息的Spyne定义SOAP客户端,python,soap,wsdl,spyne,Python,Soap,Wsdl,Spyne,我开始使用Spyne实现一个web服务。到目前为止,生成的WSDL对于消费客户机(机器客户机和人工客户机)来说都很好 唯一的问题是,他们(人类客户机)定义了一个协议,在该协议中,通过web服务来回发送的消息不需要返回值(如果您感到好奇,这是因为该协议依赖于相反方向的异步调用,在某些任务完成后提供返回反馈) 因此,他们要求我从WSDL定义中删除相关的返回消息。但我似乎找不到办法 class BusinessTransactionLogSend(ServiceBase): __service

我开始使用Spyne实现一个web服务。到目前为止,生成的WSDL对于消费客户机(机器客户机和人工客户机)来说都很好

唯一的问题是,他们(人类客户机)定义了一个协议,在该协议中,通过web服务来回发送的消息不需要返回值(如果您感到好奇,这是因为该协议依赖于相反方向的异步调用,在某些任务完成后提供返回反馈)

因此,他们要求我从WSDL定义中删除相关的返回
消息
。但我似乎找不到办法

class BusinessTransactionLogSend(ServiceBase):
    __service_name__ = "BusinessTransactionLogSend"
    __namespace__ = "tns"
    __port_types__ = ['IBusinessTransactionLogSend']

    @rpc(TransactionLog,  _body_style="wrapped", 
         _in_variable_names={'parameters': 'Log'}, 
         _args=['Log'],
         _port_type="IBusinessTransactionLogSend",
         _returns=None,
         _out_message_name='LogResponse')
    def Log(ctx, parameters):
        time.sleep(1)
这是服务和RPC
日志。我已经尝试过放置
\u returns=None
,但是WSDL仍然有

<wsdl:types>
  <xs:schema targetNamespace="https://www.zz/" elementFormDefault="qualified">
    <xs:import namespace="tns"/>
    <xs:complexType name="LogResponse"/>
    <xs:complexType name="Log">
   ...
   ...
   <wsdl:message name="LogResponse">
     <wsdl:part name="LogResponse" element="tns:LogResponse"/>
   </wsdl:message>
  ...
   <wsdl:portType name="IBusinessTransactionLogSend">
       <wsdl:operation name="Log" parameterOrder="Log">
           <wsdl:input name="Log" message="tns:Log"/>
           <wsdl:output name="LogResponse" message="tns:LogResponse"/>
       </wsdl:operation>
   </wsdl:portType>
   ...

...
...
...
...
他们的SOAP/WSDL解析器被这条
LogResponse
消息弄糊涂了。 是否有任何方法可以跳过此操作或指示Spyne不为无效返回值生成类型和消息

我可以编写一个过滤器(或者称之为事件侦听器),它看起来像是环顾四周,但是

  • 我还没有找到一个完整的例子,也没有一个好的文档
  • 在我看来,让Spyne做家务比我好
  • 当然,我可以试着告诉我的客户忽略WSDL中的任何
    xxxResponse
    消息,但我担心他们糟糕的基于SAP的客户仍然会抱怨

    谢谢
    我发现了一个还没有被记录下来的东西,它只解决了部分问题:我们可以用

    @rpc(TransactionLog,  _body_style="wrapped",
             _in_variable_names={'parameters': 'Log'},
             _is_async=True,  #<====================== THIS ======
             _args=['Log'],
             _port_type="IBusinessTransactionLogSend",
             _returns=None
             )
    
    现在是什么

        <wsdl:portType name="IBusinessTransactionLogSend">
            <wsdl:operation name="Log" parameterOrder="Log">
                <wsdl:input name="Log" message="tns:Log"/>
            </wsdl:operation>
        </wsdl:portType>
    
    
    
    但是消息和ComplexType
    LogResponse
    仍然存在于WSDL中,即使没有人会使用它

        <wsdl:portType name="IBusinessTransactionLogSend">
            <wsdl:operation name="Log" parameterOrder="Log">
                <wsdl:input name="Log" message="tns:Log"/>
            </wsdl:operation>
        </wsdl:portType>