了解 RPC 装饰器:SOAP 和 XML 的复杂 return 参数

Understanding RPC decorators: complex return arguments with SOAP and XML

我是创建 SOAP Web 服务的新手,对 RPC 装饰器有疑问。

无论如何,我的意图是让我的 Web 服务具有稍微复杂的 return 类型(我相信它是多态的)。输入协议为 SOAP,输出协议为 XML.

我想要 return 一个包含数组的字典,每个数组的值可以是浮点数或字符串(请参见下面代码中的第 6 行)。我知道这看起来像一个 XML 元素树——但是,我不知道如何在 @rpc 装饰器的 _returns 参数中表示它。使事情稍微复杂一些,如果客户端发送无效凭据,我只想 return 字符串 "Invalid credentials"。或者 return 一个空列表可能会更容易...

非常感谢关于这个问题的一些建议!

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))

SOAP 有一种 return 类型。惯用的方法是引发错误异常,而不是 return 流氓响应(即与指定的 return 类型不兼容的响应)

如果你想 return 任意数据,你可以尝试 _return=AnyDict 甚至更好,_return=AnyXml 这会让你 return 任何你想要的。

查看此函数以了解如何将任意字典转换为 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