2011-01-19 15 views
18

Qualcuno può consigliare qualche codice semplice per configurare un semplice client e server JSON RPC utilizzando twistato?Python Twisted JSON RPC

Ho trovato txJSON-RPC, ma mi chiedevo se qualcuno avesse qualche esperienza nell'utilizzo di alcuni di questi potrebbe raccomandare qualcosa.

risposta

20

txJSONRPC è fantastico. Lo uso e funziona. Ti suggerisco di fare un tentativo.

SERVER:

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

CLIENTE:

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

Come bonus, lascerò qualche alternativa: amp. http://amp-protocol.net

+0

Ha funzionato bene tranne che per due modifiche minori. Avevo bisogno di cambiare classe Math (jsonrpc.jsonRPC): per classe Math (jsonrpc.JSONRPC): nel server e le porte mancata corrispondenza tra il codice client e server, li hanno d'accordo su una e funziona fine – 1337Rooster

+0

Potrebbe essere meglio usare 'd.addCallback (printValue); d.addErrback (printError) 'invece di' d.addCallbacks (printValue, printError) 'per catturare gli errori da' printValue() '. – jfs

+0

@ 1337Rooster, @ J.F. Sebastian: Ho risolto i problemi che hai menzionato per i futuri lettori. Grazie per i commenti. – nosklo

0

Cyclone, un'implementazione del server web Tornado asincrona scritto utilizzando contorto, ha un built-in gestore di richieste JSON-RPC che utilizza il modulo python JSON/simplejson. Il codice server e client di esempio è here.

2

Se siete alla ricerca di un approccio quadro indipendente, this lib ho spinto (usando mixin) potrebbe essere utile:

0

Wikipedia ha un sacco di implementazioni elencati per python: https://en.wikipedia.org/wiki/JSON-RPC#Implementations

Detto questo, txjason sente come quello meglio integrato con twistato. Ad esempio, sembra supportare le risposte fuori ordine fuori dagli schemi. La maggior parte di esso sarebbe portabile a python3 usando sei. La parte più orribile è la validazione dei parametri, che comunque non è esposta nella normale API pubblica.

0

Per me questo ha funzionato meglio di "librerie", parlando di client.

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