使用 spyne 微调 SOAP python 服务器以实现给定的 WSDL

Fine tuning a SOAP python server with spyne in order to implement a given WSDL

我有一个带有 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. 无法自定义字段 "name" 并且只能在 wsdl:port wsdl:service 名字="DisseminationImplService">

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

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

好的,我深入研究 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 属性 class :

class DisseminationImplService(ServiceBase):

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

但是,有一个讨厌的把戏,目前 (23/07/18) spyne 中有一个错误(请参阅问题 #571) with a 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