Python spyne-在服务定义中使用默认参数

Python spyne-在服务定义中使用默认参数,python,web-services,soap,spyne,soaplib,Python,Web Services,Soap,Spyne,Soaplib,我用的是Spyne,效果很好。我希望能够为可选参数使用默认值。据我所知,每种类型都可以在其强制形式上使用或不使用:我说得对吗 这是我的服务: from spyne.model.primitive import Unicode, Boolean @rpc(Unicode, _returns = Unicode) def optional_parameter(ctx, input = "default value") return input 当我不带参数调用它时,它什么也不返回,就像我

我用的是Spyne,效果很好。我希望能够为可选参数使用默认值。据我所知,每种类型都可以在其强制形式上使用或不使用:我说得对吗

这是我的服务:

from spyne.model.primitive import Unicode, Boolean

@rpc(Unicode, _returns = Unicode)
def optional_parameter(ctx, input = "default value")
    return input
当我不带参数调用它时,它什么也不返回,就像我用“”调用一样(空字符串)

SOAP输入(来自SoapUI):

在这里,当我使用SoapUI调用我的服务时,我得到以下错误:

输入请求:

<soapenv:Body>
  <spy:optional_parameter>
     <!--Optional:-->
     <spy:input/>
  </spy:optional_parameter>
</soapenv:Body>

输出:

  <senv:Fault>
     <faultcode>senv:Client.SchemaValidationError</faultcode>
     <faultstring>:10:0:ERROR:SCHEMASV:SCHEMAV_CVC_DATATYPE_VALID_1_2_1: Element '{spyne.examples.hello}input': '' is not a valid value of the atomic type 'xs:boolean'.</faultstring>
     <faultactor/>
  </senv:Fault>

senv:Client.SchemaValidationError
:10:0:错误:SCHEMASV:SCHEMAV_CVC_DATATYPE_VALID_1_2_1:元素“{spyne.examples.hello}input':”不是原子类型“xs:boolean”的有效值。
你有什么办法帮我吗


我正在使用Spyne 2.11.0

我找到了一种看似干净的方法:

使用默认布尔值的服务实现:

def optional_parameter_second(ctx, input):
    if input is not None:
        return my_method(input)
    else:
        return my_method()

def my_method(param = True):
    return param
来自soapUI的调用不能包含标记

<soapenv:Body>
  <spy:optional_parameter>
     <!--Optional:-->
   </spy:optional_parameter>
 </soapenv:Body>

它很有魅力

<senv:Body>
  <tns:optional_booleanResponse>
     <tns:optional_booleanResult>true</tns:optional_booleanResult>
  </tns:optional_booleanResponse>
</senv:Body>

真的

在spyne中,默认情况下,所有参数都是可选的(
min\u occurs=0
nillable=True

当从请求中省略参数时,Spyne会将其作为
None
传递,因此永远不会使用Python的默认参数。您应该将
default
kwarg传递给类型标记

例如:

@rpc(Unicode(default='default value'), _returns=Unicode)
def optional_parameter(ctx, input)
    return input

这一点,请考虑下面的摘录:

<soapenv:Body>
  <spy:optional_parameter>
     <spy:input/>
  </spy:optional_parameter>
</soapenv:Body>
在这里,标记内容再次是一个空字符串,但是由于Soap处理器正在查找子元素而不是标记内容,所以在这里它是不相关的

如果要传递显式null,请按照以下方式进行:

<soapenv:Body>
  <spy:optional_parameter>
     <spy:input xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:xsi="" xsi:nil="true"/>
  </spy:optional_parameter>
</soapenv:Body>

请注意,即使传递了显式null,如果有默认值,Spyne 2.11仍将使用默认值

见:

我不确定这是一个bug还是一个特性:)

@rpc(Unicode(default='default value'), _returns=Unicode)
def optional_parameter(ctx, input)
    return input
<soapenv:Body>
  <spy:optional_parameter>
     <spy:input/>
  </spy:optional_parameter>
</soapenv:Body>
<soapenv:Body>
  <spy:optional_parameter/>
</soapenv:Body>
<soapenv:Body>
  <spy:optional_parameter>
     <spy:input xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:xsi="" xsi:nil="true"/>
  </spy:optional_parameter>
</soapenv:Body>