如何在Spyne中访问SOAP标头

时间:2018-08-23 15:42:49

标签: python spyne

我什至无法阅读最简单的SOAP标头。

我一直在关注提供此示例的文档:

class RequestHeader(ComplexModel):
    user_name = Mandatory.Unicode
    session_id = Mandatory.Unicode

class UserService(ServiceBase):
    __tns__ = 'spyne.examples.authentication'
    __in_header__ = RequestHeader

    @rpc(_returns=Preferences)
    def some_call(ctx):
        username = ctx.in_header.user_name

但它并未说明请求的外观。我尝试过:

<soap:Header>
    <user_name>test</user_name>
    <session_id>123</session_id>
</soap:Header>

但是ctx.in_headerNone。但是,ctx.in_header_doc在那儿,所以它告诉我将XML解析为Python对象失败。

我要解析的标题如下:

<soap:Header>
    <credentials>
        <loginToken>
            <token>12345678</token>
            <key>123456789</key>
            <householdId>46345435</householdId>
        </loginToken>
        <deviceId>345345345</deviceId>
        <deviceProvider>aaa</deviceProvider>
  </credentials>
</soap:Header>

我该如何在ctx.in_header中获得它?我尝试为每个XML元素创建嵌套对象,但是它不起作用。这并不奇怪,因为文档中的基本示例也不起作用。

1 个答案:

答案 0 :(得分:1)

由于收到的文档不符合对象描述,因此您将ctx.in_header设为None。

您当前的标头可以通过以下内容进行解析:

class UserService(ServiceBase):
    __in_header__ = Unicode, Integer

...这似乎不是您想要的。

您的定义将适用于以下输入:

<soap:Header>
  <tns:RequestHeader>
    <tns:user_name>test</user_name>
    <tns:session_id>123</session_id>
  </tns:RequestHeader>
</soap:Header>

...其中tns:前缀在此处定义为RequestHeader对象的名称空间。命名空间很重要-如果您想让SOAP工作,则需要学习如何使用它们。

最后,要解析凭据标签,您至少需要类似以下定义(加上命名空间限定)的内容:

class LoginToken(ComplexModel):
    _type_info = [
        ('token', Integer),
        ('key', Integer),
        ('householdId', Integer),
    ]

class Credentials(ComplexModel):
    __type_name__ = 'credentials'
    _type_info = [
        ('loginToken', LoginToken),
        ('deviceId', Integer),
        ('deviceProvider', Unicode),
    ]

我希望有帮助。