【问题标题】:spyne - use default parameters in services definitionsspyne - 在服务定义中使用默认参数
【发布时间】:2014-12-29 17:23:21
【问题描述】:

我正在使用 Spyne,它运行良好。我希望能够为我的可选参数使用默认值。据我了解,每种类型都可以在其强制形式中使用:我说的对吗?

这是我的服务:

from spyne.model.primitive import Unicode, Boolean

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

当我不带参数调用它时,它什么也不返回,就像我用''(空字符串)调用一样。

SOAP 输入(来自 SoapUI):

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

SOAP 输出:

<senv:Body>
   <tns:optional_parameterResponse>
      <tns:optional_parameterResult/>
   </tns:optional_parameterResponse>
</senv:Body>

使用布尔值是最糟糕的,这是另一个服务:

@rpc(Boolean, _returns = Boolean)
def optional_parameter_second(ctx, input = False)
    return input

在那里,当我使用 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>

你有什么想法可以帮助我吗?

我正在使用 Spyne 2.11.0

【问题讨论】:

    标签: python web-services soap spyne soaplib


    【解决方案1】:

    在 Spyne 中,默认情况下所有参数都是可选的(min_occurs=0nillable=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>
    

    您在这里传递的不是缺少的参数,而是一个空字符串 ("")。如果要省略该参数,则必须省略标记。这意味着:

    <soapenv:Body>
      <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 仍将使用默认值(如果您有默认值)。

    见:https://github.com/arskom/spyne/blob/79f8120668ec471097f410e63fa48cdf797fae7a/spyne/protocol/xml.py#L378

    我不确定这是错误还是功能:)

    【讨论】:

      【解决方案2】:

      我发现了一种看起来很干净的方法:

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

      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>
      

      【讨论】:

        猜你喜欢
        • 2014-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 2021-04-08
        相关资源
        最近更新 更多