【问题标题】:How do I raise a SOAP Fault with a structured detail element in Spyne?如何在 Spyne 中使用结构化详细信息元素引发 SOAP 错误?
【发布时间】:2015-02-23 10:00:15
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: python soapfault spyne


    【解决方案1】:
    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。如果这对您有问题,请提出问题。

    【讨论】:

    • 感谢您的提示,这基本上是我所得到的。但是我可以不从ComplexModel__type_info__ 生成我的详细信息元素吗,类似于从我自己的ComplexModel 子类生成SOAP 响应?
    • 此解决方案有两个主要问题:a) 使用您概述的字典方法,我不再需要声明 Fault 子类(或在 @rpc 装饰器上将其声明为 _throws )。然后,我错过了绑定上的&lt;soap:fault&gt; 和portType 上的&lt;wsdl:fault&gt; 中的故障。 b) 另一方面,如果我确实声明了它,并使用它作为构造函数上的 detail 参数引发的异常,Spyne 将在 Fault 中写入字段两次,一次在 &lt;detail&gt; 元素中,并且一次在它旁边。
    • 此外,Spyne 总是在 &lt;faultcode&gt; 元素的内容前加上 senv:,即使没有声明命名空间。我通常在 spec on SOAP Fault Codes 中看不到任何暗示它们需要以命名空间为前缀的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多