具有自动(反)序列化的类型安全JSON RPC客户端。最好搭配instant_api。
instant-client的Python项目详细描述
即时客户端
具有自动(反)序列化的类型安全JSON-RPC客户端。在
pip install instant-client
对于通过HTTP进行的通信(如下例所示):
^{pr2}$instant_client
可以与任何实现JSON-RPC的服务器一起使用,但最好与^{
fromdataclassesimportdataclassfromflaskimportFlaskfrominstant_apiimportInstantAPIapp=Flask(__name__)@dataclassclassPoint:x:inty:int@InstantAPI(app)classMethods:deftranslate(self,p:Point,dx:int,dy:int)->Point:returnPoint(p.x+dx,p.y+dy)defscale(self,p:Point,factor:int)->Point:returnPoint(p.x*factor,p.y*factor)if__name__=='__main__':app.run()
那么使用客户机很简单:
fromserverimportMethods,Point# the classes we defined abovefrominstant_clientimportInstantClient# The type hint is a lie, but your linter/IDE doesn't know that!methods:Methods=InstantClient("http://127.0.0.1:5000/api/",Methods()).methodsassertmethods.scale(Point(1,2),factor=3)==Point(3,6)
这看起来很像是直接调用Methods.scale()
,这是重点(不是双关语),但实际上它确实向服务器发送了一个HTTP请求!手动编写的相同代码如下所示:
importrequestsresponse=requests.post('http://127.0.0.1:5000/api/',json={'id':0,'jsonrpc':'2.0','method':'scale','params':{'p':{'x':1,'y':2},'factor':3,},},)assertresponse.json()['result']=={'x':3,'y':6}
通常,InstantClient
构造函数有两个必需的参数:
- 在
A client from the jsonrpcclient library用于您所需的传输。例如:
fromjsonrpcclient.clients.zeromq_clientimportZeroMQClientfrominstant_clientimportInstantClientclient=InstantClient(ZeroMQClient("tcp://localhost:5000"),Methods())
为了方便起见,您还可以传递一个表示URL的字符串,该字符串将用于构造
在HTTPClient
。在 - 在
定义方法的对象。方法体可以为空,
在InstantClient
只是使用签名和类型提示来序列化参数,并在datafunctions的帮助下反序列化结果。在
客户端的methods
属性是一个简单的代理,因此:
client.methods.scale(Point(1,2),factor=3)
相当于:
client.request("scale",Point(1,2),factor=3)
它依次查找原始方法的签名。在
您的IDE/linter/type checker应该认为client.methods
就是您在开始时传递的对象,因此您可以获得所有常见的警告和自动完成。添加您自己的类型提示可以有所帮助,但不应该是必需的。在
- 项目
标签: