了解RPC装饰器:使用SOAP和XML的复杂返回参数

时间:2019-06-04 20:57:04

标签: python xml soap rpc spyne

我是刚创建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))

1 个答案:

答案 0 :(得分:0)

SOAP具有一种返回类型。惯用的方法是在错误上引发异常,而不返回恶意响应(即与指定的返回类型不兼容的响应)

如果您想返回任意数据,可以尝试_return=AnyDict甚至更好的_return=AnyXml,它可以让您返回想要的任何内容。

请参阅此功能以了解如何将任意字典转换为XML文档。

https://github.com/arskom/spyne/blob/b8925ee5dc407eb9e2a8d97047f14b10425ee01d/spyne/util/etreeconv.py#L60

此函数实现了将字典映射到XML数据的一种可能方式。这是一个有损失的过程,因此它可能适合或可能不适合您的需求。

如果它对您不起作用,则必须使用AnyXml类型并直接使用lxml构造响应。我建议使用lxml.builder api。有关更多信息,请参见此处:https://lxml.de/api/lxml.builder.ElementMaker-class.html