具有自动(反)序列化的类型安全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代码中实现两个侦听器时发生swing错误   Lambda是否完全取消了Java8中匿名内部类的使用?   swing OpenSuse 12.3+Java双显示   POM中的java错误。xml文件,即使在清理{users}/之后。m2/用于*上次更新文件的存储库   JavaEDT特定的方法和其他东西   java如何使用GridLayout设置组件大小?有更好的办法吗?   java在itext7中生成二维码时,如何调整点的大小?   java如何在多行上显示文本并右对齐?   java在WebSphereCluString环境中分离Log4j日志   JAVA从文件读取,返回BigInteger值   当使用rxjava2进行排列时,使用javamockito。重试()   在java fasterxml中创建Xml   使用64位整数进行模运算的64位整数的java快速乘法,无溢出   java静态变量保留以前发布的值   datastax enterprise SSTable loader流式处理无法提供java。木卫一。IOException:对等方重置连接   java匹配的通配符是严格的,但找不到元素“mvc:annotationdriven”的声明。标准包装。可抛出   java无法在浏览器上下载文件文档?