具有自动(反)序列化的类型安全JSON RPC客户端。最好搭配instant_api。

instant-client的Python项目详细描述


即时客户端

Build StatusCoverage StatusSupports Python versions 3.7+

具有自动(反)序列化的类型安全JSON-RPC客户端。在

pip install instant-client

对于通过HTTP进行的通信(如下例所示):

^{pr2}$

instant_client可以与任何实现JSON-RPC的服务器一起使用,但最好与^{}配合使用。例如,假设API服务器的设置如下:

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构造函数有两个必需的参数:

  1. A client from the jsonrpcclient library用于您所需的传输。例如:

    fromjsonrpcclient.clients.zeromq_clientimportZeroMQClientfrominstant_clientimportInstantClientclient=InstantClient(ZeroMQClient("tcp://localhost:5000"),Methods())

    为了方便起见,您还可以传递一个表示URL的字符串,该字符串将用于构造HTTPClient。在

  2. 定义方法的对象。方法体可以为空,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就是您在开始时传递的对象,因此您可以获得所有常见的警告和自动完成。添加您自己的类型提示可以有所帮助,但不应该是必需的。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
选项卡内的java 安卓工具栏   java接口VS API VS公共类   无法解析java。lang.ClassNotFoundException:在安卓 studio中找不到类“com.example.安卓.camera2basic.AutoFitTextureView”?   java等待线程正常完成   java在JTable中的prepareRenderer方法中编辑单元格数据是否可行?   java SessionNotCreatedException selenium webdriver   java Android Studio Gradle CreateProcess错误=2   java找不到适用于异常(int)的构造函数   javascript如何在不使用正则表达式的情况下检查输入是否为表情符号?   从JAVA运行ant时,JAVA_HOME变量不正确   long的java min值引发异常   java如何在这段代码中实现侦听器?   带有透明文本的java Android按钮   图像Java扫描仪问题(JFrame)   java模拟输入蒸汽似乎在Junit测试的第一次输入中就被吃掉了   压缩Java Deflater,现在和将来的结果相同(确定性)   java JTable getModel()。setValueAt从数组中删除第一个元素   java我有不同于编译器和计算器的价值   使用C#客户端调用基本身份验证java webservice   java相同类型的多个@Embedded字段在持久化后始终为空