使用 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 之后,我认为它缺少执行此操作的选项(我很乐意错了关于它 !)。通常,我有三个问题:
无法自定义字段"name"的值,只能在wsdl:part中使用(它采用公开服务的名称并添加"Response") :
<wsdl:message name="monitorDisseminationResponse">
<wsdl:part name="monitorDisseminationResponse" element="tns:monitorDisseminationResponse"/>
</wsdl:message>
无法自定义字段名称和类型,只能在 wsdl:binding 中自定义(它采用应用程序的名称):
<wsdl:binding name="DisseminationImplService" type="tns:DisseminationImplService">
无法自定义字段 "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
我有一个带有 Java soap 界面的客户端。提供了 WSDL,我必须实现一个复制它的服务器。问题是我无法微调我的 spyne 制作的 WSDL 以准确重现提供的 WSDL,在查看 spyne API 之后,我认为它缺少执行此操作的选项(我很乐意错了关于它 !)。通常,我有三个问题:
无法自定义字段"name"的值,只能在wsdl:part中使用(它采用公开服务的名称并添加"Response") :
<wsdl:message name="monitorDisseminationResponse"> <wsdl:part name="monitorDisseminationResponse" element="tns:monitorDisseminationResponse"/> </wsdl:message>
无法自定义字段名称和类型,只能在 wsdl:binding 中自定义(它采用应用程序的名称):
<wsdl:binding name="DisseminationImplService" type="tns:DisseminationImplService">
无法自定义字段 "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