2

Spyne 手册指出,使用 Spyne 创建 SOAP 错误的正确方法是引发(spyne.model.fault.Fault或您自己的子类)的实例:

@add_metaclass(ComplexModelMeta)
class Fault(ComplexModelBase, Exception):
    # ...

我试图理解为什么它是子类ComplexModelBase。我最初的假设是我在子类中声明了我想要进入 SOAP Fault 元素的<detail>元素Fault,如下所示:

class MyApplicationError(Fault):
    __namespace__ = 'http://myapplication.com/ns'
    _type_info = [
        ('reason', Unicode),
    ]

但是,当实际引发这个异常时,看起来我必须将一个普通的 dict 传递给detail构造函数的参数。

detail用结构化数据集填充的最佳实践是什么?我什至在我的Fault子类中声明这个结构吗?
如果是,我该如何填写?如果不是,为什么要Faultsubclass ComplexModelBase

4

1 回答 1

2
Fault(detail={'foo': {'bar': 123}})

将序列化为:

<ns0:Fault xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/">
  <faultcode>soap11env:Server</faultcode>
  <faultstring>Fault</faultstring>
  <faultactor></faultactor>
  <detail>
    <foo>
      <bar>123</bar>
    </foo>
  </detail>
</ns0:Fault>

您可以在子类中编写一个新的构造函数,Fault以便更轻松地生成详细信息字典。例如:

class SuperFault(Fault):
    def __init__(self, foo, bar):
        super(SuperFault, self).__init__('Server.SuperFault', 'E001234',
                                detail={'SuperFault': {'foo': foo, 'bar': bar}})

请注意,由于一些愚蠢的限制,传递给 detail 的 dict 的长度必须为 1。如果这对您有问题,请提出问题。

于 2015-03-01T19:30:35.420 回答