如何在 Spyne 中访问 SOAP headers

How to access SOAP headers in Spyne

连最简单的SOAP我都看不懂header。

我一直在关注给出这个例子的文档:

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 object 失败了。

我正在尝试解析的 header 看起来像这样:

<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 元素创建嵌套的 object,但它不起作用。这并不让我感到惊讶,因为文档中的基本示例也不起作用。

您收到的 ctx.in_header 为 None,因为传入文档不符合 object 描述。

您当前的 header 可以通过以下方式解析:

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 object 的命名空间。名称空间很重要——如果您想让 SOAP 的东西正常工作,您需要学习如何使用它们。

最后,要解析 credentials 标签,您至少需要如下定义(加上命名空间限定):

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),
    ]

希望对您有所帮助。