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

标签 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

当我不带参数调用它时,它不会返回任何内容,就像我使用 '' (空字符串)调用一样。

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>

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

@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

最佳答案

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

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

关于python - spyne - 在服务定义中使用默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27693263/

相关文章:

python - 在一个字符串中查找多个子字符串,而无需对其进行多次遍历

python - 如何记录从元类继承的方法?

python - Pandas Dataframe 查找所有列都相等的行

rest - WCF、Web API、WCF REST 和 Web 服务之间的区别?

python - Django,即使在 collectstatic 之后也没有提供 uwsgi 静态文件

java - 如何让JAXB正确生成XML?

web-services - 使用 New-WebServiceProxy 在 PowerShell 中添加自定义 SOAP header

java - 如何在 CXF 中拦截 WSDL 请求?

.net - 从多个 XSD 创建 XML/SOAP 客户端?

java - HTTPServletResponse 状态代码不在 HTTP 响应 header 中