我正在尝试spyne hello world example,代码基本上是:
class HelloWorldService(ServiceBase):
@srpc(Unicode, Integer, _returns=Array(Unicode))
def say_hello(name, times):
for i in range(times):
yield 'Hello, %s' % name
application = Application([HelloWorldService],
tns='spyne.examples.hello',
in_protocol=JsonDocument(validator='soft'),
out_protocol=JsonDocument()
)
if __name__ == '__main__':
from wsgiref.simple_server import make_server
wsgi_app = WsgiApplication(application)
server = make_server('0.0.0.0', 7789, wsgi_app)
print "rpc server start"
server.serve_forever()
我正在尝试使用requests连接到它:
url = "http://127.0.0.1:7789/sayhello"
data = { "name": "World", "times": 4 }
headers = { 'content-type': 'application/json' }
r = requests.post(url, data=json.dumps(data), headers=headers)
它返回404。
但如果我使用HttpRpc协议,请求方式就可以了。
那么如何实现客户端以使用Json Document协议。首选使用lib requests
。
答案 0 :(得分:1)
如果要将JsonDocument用作in_protocol,则应使用此表示法来发送数据...
data = { "say_hello" : { "name": "World", "times": 4 } }
这意味着您应该将函数名称作为json中的主键传递,其内容应该是带有函数参数的json。
并且您的网址应该相同,但没有功能名称,即:
url = "http://127.0.0.1:7789/"
如果您想查看更多内容,可以在http://spyne.io/blog/
阅读spyne博客答案 1 :(得分:1)
我刚刚通过JsonDocument协议示例将请求添加到http://spyne.io。
检查出来:http://spyne.io/#inprot=JsonDocument&outprot=JsonDocument&s=rpc&tpt=WsgiApplication&validator=true
供参考;你可以做到这两点:
curl http://localhost:7789 -d '{ "say_hello" : { "name": "World", "times": 4 } }'
或
curl http://localhost:7789 -d '{ "say_hello" : ["World", 4]}'
参数顺序与Python端的参数顺序相同。