代码之家  ›  专栏  ›  技术社区  ›  Pawel Decowski

如何在Spyne中访问SOAP头

  •  0
  • Pawel Decowski  · 技术社区  · 6 年前

    我连最简单的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_header None . 然而, ctx.in_header_doc

    Im试图解析的头如下所示:

    <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 U标题 ? 我试着为每个XML元素创建嵌套对象,但没有成功。这也不奇怪,因为文档中的基本示例也不起作用。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Burak Arslan    6 年前

    你得到了 ctx.in_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对象的名称空间。名称空间是很重要的——如果您想让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),
        ]
    

    我希望这会有帮助。