我什至无法阅读最简单的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
在那儿,所以它告诉我将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元素创建嵌套对象,但是它不起作用。这并不奇怪,因为文档中的基本示例也不起作用。
答案 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),
]
我希望有帮助。