Python Twisted JSON RPC

19

有人能推荐一些简单的代码,使用twisted设置一个简单的JSON RPC客户端和服务器吗?

我找到了txJSON-RPC,但我想知道是否有人有使用其他库的经验并能够推荐一些东西。

5个回答

21

txJSONRPC很不错。我使用它,它有效地工作。我建议你也试一试。

服务器:

from txjsonrpc.web import jsonrpc
from twisted.web import server
from twisted.internet import reactor

class Math(jsonrpc.JSONRPC):
    """
    An example object to be published.
    """
    def jsonrpc_add(self, a, b):
        """
        Return sum of arguments.
        """
        return a + b

reactor.listenTCP(7080, server.Site(Math()))
reactor.run()

客户端:

from twisted.internet import reactor
from txjsonrpc.web.jsonrpc import Proxy

def printValue(value):
    print "Result: %s" % str(value)

def printError(error):
    print 'error', error

def shutDown(data):
    print "Shutting down reactor..."
    reactor.stop()

proxy = Proxy('http://127.0.0.1:7080/')

d = proxy.callRemote('add', 3, 5)
d.addCallback(printValue).addErrback(printError).addBoth(shutDown)
reactor.run()

作为额外的福利,我将留下一些替代品:amp。 http://amp-protocol.net


除了两个小改动外,一切都运行良好。我需要在服务器中将 class Math(jsonrpc.jsonRPC) 更改为 class Math(jsonrpc.JSONRPC)并且在客户端和服务器端代码中端口不匹配,让它们达成一致,就可以正常工作了。 - Alex Amato
为了捕获来自printValue()的错误,最好使用d.addCallback(printValue); d.addErrback(printError)而不是d.addCallbacks(printValue, printError) - jfs
@1337Rooster,@J.F. Sebastian:我已经修复了你们提到的问题,以便未来的读者。感谢您的评论。 - nosklo
我如何向请求添加额外的头部,例如csrf令牌?例如Transmission的rpc服务器需要将X-Transmission-Session-Id附加到请求头中。 - zer0c00l
JSON-RPC 2.0目前还不被txjsonrpc支持,这让我花了一些时间才想明白。 - Sergey

2
如果您正在寻找一个不依赖于框架的方法,我推出的这个库(使用mixin)可能会有所帮助:this lib

0

对我来说,这比“库”更好,特别是在客户端方面。

    TESTDATA = {'id': 1234,
                'method': 'getbalance',
                }
    URL = 'http://localhost:7777'

    d= getPage(URL,method="POST",postdata=json.dumps(TESTDATA))
    d.addBoth(lambda x :print(json.loads(x)))

0

Cyclone是一个使用Twisted编写的Tornado异步Web服务器实现,它具有内置的json-rpc请求处理程序,使用Python json/simplejson模块。这里提供了示例服务器和客户端代码here


0

维基百科列出了许多Python的实现:https://en.wikipedia.org/wiki/JSON-RPC#Implementations

话虽如此,txjason 觉得它是与 Twisted 最好集成的。它似乎支持开箱即用的无序响应等功能。大部分都可以使用 six 移植到 Python3 上。最可怕的部分是参数验证,但在正常的公共API中并没有暴露。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接