【问题标题】:Fine tuning a SOAP python server with spyne in order to implement a given WSDL使用 spyne 微调 SOAP python 服务器以实现给定的 WSDL
【发布时间】:2018-07-19 10:17:24
【问题描述】:

我有一个带有 Java soap 接口的客户端。提供了 WSDL,我必须实现一个复制它的服务器。问题是我无法微调我的 spyne 制作的 WSDL 以准确重现提供的 WSDL,并且在查看 spyne API 之后,我认为它缺少执行此操作的选项(我很乐意错了!) .通常,我有三个问题:

  1. 不能自定义字段“name”的值,只能在wsdl:part中取值(取暴露服务的名称,加上“Response”):

        <wsdl:message name="monitorDisseminationResponse">
           <wsdl:part name="monitorDisseminationResponse" element="tns:monitorDisseminationResponse"/>
        </wsdl:message>
    
  2. 无法自定义字段名称和类型,只能在 wsdl:binding 中自定义(它采用应用程序的名称):

    <wsdl:binding name="DisseminationImplService" type="tns:DisseminationImplService">
    
  3. 无法自定义字段“名称”,只能在 wsdl:port 中自定义 wsdl:service name="DisseminationImplService">

    <wsdl:service>
    <wsdl:port name="DisseminationImplService" binding="tns:DisseminationImplService">
    <soap:address location="http://sample:9000/Dissemination"/>
    </wsdl:port>
    </wsdl:service>
    

所以,我想知道如何继续前进,并欢迎一些建议。

【问题讨论】:

    标签: python web-services soap wsdl spyne


    【解决方案1】:

    好的,我深入研究了 API,并认为我找到了解决我在 spyne/interface/wsdl/wsdl11.py 中的猴子补丁问题的解决方案

    对于问题 #1,我没有费心进行更改,但它应该可以像 #2 和 #3 一样解决

    问题 #2 可以通过猴子修补方法来解决:

    from spyne.interface.wsdl.wsdl11 import Wsdl11
    
    def _get_binding_name(self, port_type_name):
        if port_type_name == "NameIDoNotWant":
            port_type_name = "NameIWant"
        return port_type_name # subclasses override to control port names.
    
    Wsdl11._get_binding_name = _get_binding_name
    

    对于#3,我为我的服务类使用了__port_types__ 类属性:

    class DisseminationImplService(ServiceBase):
    
        __port_types__ = ['Dissemination']
        @srpc(Unicode, Unicode, DisseminationInfo, _port_type='Dissemination', _returns=DisseminateResponse)
    

    但是,有一个讨厌的技巧,目前 (23/07/18) spyne 中存在一个错误(参见问题#571),其中一个尚未合并的fix。没有它,端口将没有 wsdl 中的传输密钥。

    最后,您需要修改 wsdl 中的端口名称:

    def _add_port_to_service(self, service, port_name, binding_name):
        """ Builds a wsdl:port for a service and binding"""
    
        ### spyne code####
    
        if port_name == "NameIDoNotWant":
            wsdl_port.set('name', "NameIWant")
        else:
            wsdl_port.set('name', port_name)
       ### spyne code####
    
    Wsdl11._add_port_to_service = _add_port_to_service
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多