1

私は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 を使用しています

4

2 に答える 2

3

Spyne では、すべてのパラメーターはデフォルトでオプション (min_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>

ここで不足している引数を渡しているのではなく、空の文字列 ( "") を渡しています。そのパラメーターを省略したい場合は、タグを省略しなければなりません。つまり:

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

Spyne 2.11 は、明示的な null が渡された場合でも、デフォルト値があればそれを使用することに注意してください。

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

これがバグなのか機能なのかわかりません:)

于 2015-01-01T21:26:40.917 に答える