在spyne中删除响应数组包装器httprpc - > JSON

时间:2016-07-21 14:10:08

标签: json spyne

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

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

我得到了〜

    serviceResp([{ ... }]);

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

它将它包装在Result / Response包装器中,

    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"]

任何人都可以解释如何从响应中删除数组包装器吗?

-James

1 个答案:

答案 0 :(得分:0)

编辑后回答:您的返回类型标识为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 的问题,所以你需要自己搞清楚。