如何在 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_header
是 None
。但是,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),
]
希望对您有所帮助。
连最简单的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_header
是 None
。但是,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),
]
希望对您有所帮助。