我是刚创建SOAP Web服务的新手,并且对RPC装饰器有疑问。
无论如何,我的意图是使我的Web服务具有某种复杂的返回类型(我相信这是它的多态性)。输入协议是SOAP,输出协议是XML。
我想返回一个包含数组的字典,每个字典的值都可以是浮点数或字符串(请参见下面的代码第6行)。我知道这看起来像XML元素树-但是,我不知道如何在@rpc装饰器的_returns参数中表示这一点。为了使事情稍微复杂一点,如果客户端发送无效的凭据,我只想返回字符串“ Invalid certificate”。也许返回空列表会更容易...
非常感谢您提供有关此问题的一些建议!
class CoreService(ServiceBase):
@rpc(Unicode, Unicode, Integer, _returns=Unicode) #@rpc arguments corespond to the retrieve_score() arguments below
def retreive_score(ctx, username, password, uid):
if validate_creds(username,password):
return {"score:" 0.6, features=[{"gender": "male"}, {"height": 160], ... ]
else:
return "Invalid credentials"
application = Application([CoreService], 'spyne.iefp.soap',
in_protocol=Soap11(validator='lxml'),
out_protocol=XmlDocument(polymorphic=True))
答案 0 :(得分:0)
SOAP具有一种返回类型。惯用的方法是在错误上引发异常,而不返回恶意响应(即与指定的返回类型不兼容的响应)
如果您想返回任意数据,可以尝试_return=AnyDict
甚至更好的_return=AnyXml
,它可以让您返回想要的任何内容。
请参阅此功能以了解如何将任意字典转换为XML文档。
此函数实现了将字典映射到XML数据的一种可能方式。这是一个有损失的过程,因此它可能适合或可能不适合您的需求。
如果它对您不起作用,则必须使用AnyXml类型并直接使用lxml构造响应。我建议使用lxml.builder api。有关更多信息,请参见此处:https://lxml.de/api/lxml.builder.ElementMaker-class.html