此项目是作为客户机库的json-rpc v2.0规范(向后兼容)的实现,适用于python 2.7和python 3。这个版本是josh marshall开发的jsonrpclib的一个分支,也可以用于pelix/ipopo远程服务。

jsonrpclib-pelix的Python项目详细描述


#jsonrpclib(为pelix和python 3打补丁)

[![最新版本](https://img.shields.io/pypi/v/jsonrpclib pelix.svg)(https://pypi.python.org/pypi/jsonrpclib pelix/)
[![许可证](https://img.shields.io/pypi/l/jsonrpclib pelix.svg)(https://pypi.python.org/pypi/jsonrpclib pelix/)
[![特拉维斯CI状态](https://travis-ci.org/tcalmant/jsonrpclib.svg?branch=master)(https://travis ci.org/tcalmant/jsonrpclib)
[![工作服状态](https://coveralls.io/repos/tcalmant/jsonrpclib/badge.svg?branch=master)(https://coveralls.io/r/tcalmant/jsonrpclib?branch=master)

此库是json-rpc规范的一个实现。
它既支持原始的1.0规范,也支持新的
(建议的)2.0规范,其中包括批量提交、关键字
参数等。


[apache软件许可证2.0](<;http://www.apache.org/licenses/license-2.0.html>;)。



https://github.com/joshmarshall/jsonrpclib>;)。

与Python2.7保持兼容。
对Python2.6的支持已被放弃,因为它已变得难以维护。
*现在可以在扩展
`SimpleJSonRpcDispatcher`时使用'dispatch`方法参数,使用自定义调度程序。
这允许Pelix远程服务使用此包。
*它可以使用线程池来控制生成的线程数,以处理
通知请求和客户端连接。
*此项目的其他分支中添加的修改已被添加:
*来自[drdaeman/jsonrpclib](<;https://github.com/drdaeman/jsonrpclib>;):
*改进的json-rpc 1.0支持
*不太严格的错误响应处理
*来自[tuomasalo/jsonrpclib](<;https://github.com/tuomasalo/jsonrpclib>;):
*如果出现非预定义错误,则引发apperror并授予对来自[dejw/jsonrpclib](<;https://github.com/dejw/jsonrpclib>;)的*error.data*
*的访问权:
*自定义头可以与请求和相关测试一起发送
*自0.4版以来,此包重新添加了对Unix套接字的支持。
*此包不能与原始的"jsonrpclib"一起安装,因为它使用了相同的名称。


因此,使用"xmlrpclib"的项目可以很容易地被
修改为使用json并进行差异试验。

包括:

-批提交(通过"multicall"类)
-关键字参数
-通知(批处理和"normal")
-使用"jsonClass"键进行类转换。

它旨在模拟默认python发行版中的
`simplexmlrpcserver'。



然后是"simplejson"外部库。
要使用此库,必须安装其中一个库,但如果标准发行版为2.7+,则应该已经安装了一个库。
请记住,我相信"cjson"应该是最快的,因此,如果您要进行全面优化,您可能需要单击它。

\pip install

jsonrpclib pelix
```

或者,您可以从github存储库
[tcalmant/jsonrpclib](http://github.com/tcalmant/jsonrpclib)下载源代码,并使用以下命令手动安装它:

````
git clone git://github.com/tcalmant/jsonrpclib.git
cd jsonrpclib
python setup.py安装
```

等。

**注意:**导入行与常规的
`simplexmlrpcserver`略有不同,因为"simplejsonrpcserver"是由jsonrpclib库提供的。


``python
y:x+y,'add')
server.register_function(lambda x:x,'ping')
server.serve_forever()
`````

要开始使用ssl保护服务器,请使用以下代码段:

``python
从jsonrpclib.simplejsonrpcserver导入simplejsonrpcserver
导入ssl

socket
server=simplejsonrpcserver(('localhost',8080),bind_and_activate=false)
server.socket=ssl.wrap_socket(server.socket,certfile='server.pem',
server_side=true)
server.server_bind()
server.server_activate()

注册函数
通过使用"set_notification_pool()"方法将其提供给服务器:

``python
from jsonrpclib.simplejsonrpcserver import simplejsonrpcserver
from jsonrpclib.threadpool import threadpool

=线程池(max_threads=10,min_threads=0)

8080))
服务器。设置通知池(池)

(让线程完成当前任务)
pool.stop()
server.set_notification_pool(none)
`````

0到30个线程。
可以使用类
构造函数的"thread_pool"参数指定自定义池。


通知池和请求池不同:默认情况下,带有请求池的服务器没有通知池。

``python
from jsonrpclib.simplejsonrpcserver import pooledjsonrpcserver
from jsonrpclib.threadpool import threadpool

最小线程数=0)
请求池=线程池(最大线程数=50,最小线程数=10)


线程池=请求池
服务器。设置通知池(nofif池)

#注册方法
服务器。注册函数(POW)
服务器。注册函数(lambda x,y:x+y,"add")
服务器。注册函数(lambda x:x,"ping")

尝试:
server.serve_forever()
最后:
停止线程池(让线程完成当前任务)
request_pool.stop()
nofif_pool.stop()
server.set_notification_pool(none)
```

unix socket

在unix套接字上监听,您必须使用以下代码段:


``python
from jsonrpclib.simplejsonrpcserver import simplejsonrpcserver
import os
import socket

但是(或将引发错误)
如果os.path.exists(套接字名称):
os.remove(套接字名称)

try:
…)
srv=simplejsonrpcserver(socket_name,address_family=socket.af_unix)

向服务器注册方法
运行服务器
srv.serve\u forever()
除了键盘中断:
优雅地关闭服务器
srv.shutdown()
srv.server\u close()
最后:
您应该在服务器停止后清理
os.remove(socket_name)
```


此功能在travis ci构建期间在linux上测试。它也已经在Windows 10 1809上的Windows Linux子系统(WSL)上进行了测试。


此功能在"纯"Windows上不可用,因为它不提供
"af懔unix"地址系列。

6)
>11
>>>1;服务器。服务器。添加(x=5,y=10)
>15
>>>15;服务器。服务器。通知。添加(5,6)
不返回结果…
>>>>gt;batch=jsonrpclib.multicall(服务器)multicall(服务器)
>>gt>1;批量。添加(5,6)
>>>gt>gt;批量。ping({'key':'value''>>
>;gt;gt>15;服务器。添加(5,6)
>;批量。批量添加(5,6)
>;批量。批量添加(5,6)
>;批量添加(5,批处理。通知。添加(4,30)
>;>results=batch()
>;>打印(结果)
11
{key':'value'}
server=jsonrpclib.serverproxy('http://localhost:8080,history=history)
>;>server.add(5,6)
11
>;>print(history.request)
{"id":"f682b956-c8e1-4506-9db4-29fe8bc9fcaa","jsonrpc":"2.0",
"method":"add","params":[5,6]}
>;>打印(history.response)
{"id":"f682b956-c8e1-4506-9db4-29fe8bc9fcaa","jsonrpc":"2.0",
"result":11}

尽管最好是为
`jsonrpclib.serverproxy`:

``python
>;>import jsonrpclib
>;>jsonrpclib.config.default.version
2.0
>;>config=jsonrpclib.config.config(version=1.0)
>;>history=jsonrpclib.history.history()
>;>server=jsonrpclib.serverproxy('http://localhost:8080',config=config,
history=history)
>;>server.add(7,10)
17
>;>打印(history.request)
{"id":"827b2923-5b37-49a5-8b36-e73920a16d32",
"method":"add","params":[7,10]}
>;>;打印(history.response)
{"id":"827b2923-5b37-49a5-8b36-e73920a16d32","error":null,"result":17}
>;>;服务器('close`())
`
/>也存在等效的"loads"和"dumps"函数,尽管有一些小的修改。
"dumps"参数几乎相同,但它添加了三个参数:
"rpc id"用于"id"键,"version"用于指定JSON-RPC兼容性,
和"notify"(如果是您希望成为通知的请求)。

返回请求/响应的整个结构以进行手动分析。

您必须使用特定的
协议:`unix+http`.


主机部件将被忽略。例如,可以使用此url在`/var/lib/daemon.socket`:`unix+http://./var/lib/daemon.socket`

**注意:**当前,只有http支持unix套接字。
如果要实现https支持,请创建一个
[github上的问题](https://github.com/tcalmant/jsonrpclib/issues)


\创建"serverproxy"时:

``python
>;>import jsonrpclib
>;>server=jsonrpclib.serverproxy("http://localhost:8080",
headers={'x-test':'test})
```

某些方法
调用:

`` python
>;>test_server.ping(42)

>>;x-test header将不再在请求中发送
```

虽然默认情况下它是关闭的。
如果使用不当,速度会非常慢,因此下面只是使用时要记住的一个小列表。

-让它(对象)保持简单愚蠢。(对于异常,请继续读取)
-不需要init参数(对于异常,请继续读取)
-不带setter的getter属性可能很危险(读取:未测试)

使用`_serialize`方法(参见下面的用法)。
服务器和客户机必须**都**启用了` use_jsonClass`配置
项,并且它们都必须访问
对象使用的相同库才能正常工作。

最好关闭
转换,并使用
`jsonrpclib.jsonclass.dump`/`jsonrpclib.jsonclass.load`(因为
默认行为递归地通过属性和列表/dicts/元组)在特定对象上手动调用它。

*示例文件:`测试对象py`

``python
init params和属性值的元组(init params
可以是dict或list,但属性值必须是dict)。
类testserial(object):
foo='bar'
def初始化(self,*args):
self.args=args
def_serialize(self):
返回(self.args,{'foo':self.foo,})
````

-示例用法:

``python
>;>;导入jsonrpclib
>;>;导入测试对象

server=jsonrpclib.server('http://localhost:8080',history=history)

打印(history.request)
{"id":"7805f1f9-9abd-49c6-81dc-dbd47229fe13","jsonrpc":"2.0",
"method":"ping","params":"[{"jsonclass":
["test_obj.testserial",[],"foo":"bar"}
]}
>;>print(history.response)
{"id":"7805f1f9-9abd-49c6-81dc-dbd47229fe13","jsonrpc":"2.0",
"result":"{"{"jsonClass":["test""obj.testserial",[],"foo":"bar"}
````

默认情况下会启用此行为。
若要停用它,只需将服务器"config"的"use撸jsonClass"成员设置为
"false"。
如果要使用每类序列化方法,请在服务器"config"的"serialize撸method"成员中设置其名称。
最后,如果您使用的是在实现中定义的类
(如中所示,而不是一个单独的库),您需要使用'config.classes.add()'方法添加那些
(在**服务器和客户端上)。

非常感谢。

它们可以使用*unittest*或*notest*运行:

```
python-m unittest discover tests
python3-m unittest discover tests
notests
````

why json-rpc?

在我看来,在rpc中选择json而不是xml有几个原因:

*阅读起来要简单得多(我想这是观点,但我知道我是对的。:)
*大小/带宽-主要原因是,json对象表示要小得多。
*解析-json应该比xml解析快得多。
*为了公平起见,使用"jsonClass"传递简单类(启用时)

,选择xml而不是json还有几个原因:


*您的服务器不支持json(相当明显)
*跨api更广泛的xml-rpc支持(我们可以改变这一点吗?:)
*库更加建立,*即*更加稳定(让我们也改变这个)

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

推荐PyPI第三方库


热门话题
java提高机器学习Rest服务性能   java反转字符的字符串顺序,并使用构造函数将其放入LinkedList   继承为什么Java不支持在方法签名中添加“throws”?   执行DDL alter table if exists任务时发生java错误。城市   java在eclipse中使用CREATETXT并打包在jar中   java AES256与3DES 256密钥检测   具有两个相同类型字段的java JPA实体   java Webapp日志记录设置被忽略   java KeyEventDispatcher可以在一个应用程序中工作,但不能在另一个应用程序中工作   带有Swing和OpenJDK的java PinchZoom   未涉及java AspectJ注释切入点(对于任何注释类型)   java如何在FuseBAI中获取日志文件详细信息   java在Linux上将wstring转换为jstring