【问题标题】:Remove response array wrapper in spyne httprpc -> json删除 spyne httprpc -> json 中的响应数组包装器
【发布时间】:2016-07-21 14:10:07
【问题描述】:

开箱即用的 Spyne 似乎将输出 JSON(P) 消息包装在一个数组中。与

 out_protocol=JsonP('serviceResp', ignore_wrappers=True),

我明白了~

    serviceResp([{ ... }]);

    out_protocol=JsonP('serviceResp', ignore_wrappers=False),

它将它包装在一个结果/响应包装器中,

    serviceResp({"appResponse": {"appResult": [{ ... }]);

我尝试设置 _body_style='bare',看看它是否有任何效果,但收到关于太多函数参数的错误 (??)。

     Exception: body_style='bare' can handle at most one function argument.

我还尝试将 _returns= 设置为各种类型,但没有成功。

EDIT1:这里有一些示例代码实际上将结果包装在一个数组中。 EDIT2:修改了下面的代码以产生更简单的消息。

import logging
logging.basicConfig(level=logging.DEBUG)
from spyne.application import Application
from spyne.decorator import srpc
from spyne.service import ServiceBase
from spyne.model.primitive import Integer
from spyne.model.primitive import Unicode
from spyne.model.complex import Iterable
from spyne.protocol.http import HttpRpc
from spyne.protocol.json import JsonDocument
from spyne.server.wsgi import WsgiApplication

class HelloWorldService(ServiceBase):
    @srpc(_returns=Unicode)
    def say_hello():
        yield 'Hello, James'

application = Application([HelloWorldService],
    tns='spyne.examples.hello',
    in_protocol=HttpRpc(validator='soft'),
    out_protocol=JsonDocument()
)
if __name__ == '__main__':
    # You can use any Wsgi server. Here, we chose
    # Python's built-in wsgi server but you're not
    # supposed to use it in production.
    from wsgiref.simple_server import make_server
    wsgi_app = WsgiApplication(application)
    server = make_server('0.0.0.0', 8000, wsgi_app)
    server.serve_forever()

http://server/say_hello

["Hello, James"]

谁能解释如何从响应中删除数组包装器?

-詹姆斯

【问题讨论】:

    标签: json spyne


    【解决方案1】:

    编辑后回答:您的返回类型指定为Unicode,但您返回的是str 对象数组。返回单个 unicode 对象而不是字符串的可迭代对象,您应该没问题。


    1.

    在底层,每个 RPC 都有一个参数——请求对象。在裸模式下,您可以手动生成此对象。

    所以像这样的非裸方法:

    @rpc(Integer, Unicode, Unicode, DateTime)
    def foo(ctx, i, s1, s2, d):
        pass
    

    变成:

    class FooRequest(ComplexModel):
        i = Integer
        s1 = Unicode
        s2 = Unicode
        d = DateTime        
    
    @rpc(FooRequest, _body_style='bare')
    def foo(ctx, req):
        pass
    

    在包装模式下,Spyne 会自动为您执行此操作。在裸机模式下,你是一个人。

    2.

    Spyne 不会将响应包装在数组中。如果你看一下relevant test,你会看到实际的输出是这样的:

    some_callback({"i": 42, "s": "foo"});
    

    我也许可以帮助您更多地追踪该数组的来源,但您似乎只不过是一个普通的移情挑战者,在没有 Spyne 代码的情况下提出 Spyne 问题,所以你需要自己弄清楚。

    【讨论】:

    • 以上是 MWE。它仍然将回复包装在 [ ] 中,作为您框架的早期学习者,我不知所措。
    • 再次感谢布拉克的评论。我已经修改了 spyne.io 中的示例代码,绝对不会尝试返回数组,但它仍然可以。 :?
    • 你没有回来,你在屈服。它们是两个非常不同的东西。请仅在确定需要时尝试退货并让步。
    • str 对象的单个产量意味着具有单个元素的可迭代对象。所以从 json 的角度来看,它仍然是一个数组。
    • 是的,做到了!我什至没有考虑过收益与回报。这是公认的答案,谢谢 Burak!
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多