[Python] 最简单的远程调用实现:XML-RPC模块
XML-RPC 是一种远程过程调用方法,它使用通过 HTTP 传递的 XML 作为载体。 有了它,客户端可以在远程服务器上调用带参数的方法(服务器以 URI 命名)并获取结构化的数据。
- XML-RPC 最明显的应用领域是连接不同类型的环境,允许 Java 与 Perl、Python、ASP 等进行通信上。
XML-RPC 可以让我们很容易的构造一个简单的远程调用服务。你所需要做的仅仅是创建一个服务器实例,通过它的方法 register_function() 来注册函数,然后使用方法 serve_forever() 启动它。
XML-RPC暴露出来的函数只能适用于部分数据类型,比如字符串、整形、列表和字典。对于其他类型就得需要做些额外的功课了
xmlrpc.server
import datetime
class ExampleService:
def getData(self):
return '42'
class currentTime:
@staticmethod
def getCurrentTime():
return datetime.datetime.now()
with SimpleXMLRPCServer(("localhost", 8000)) as server:
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
server.register_instance(ExampleService())
print('Serving XML-RPC on localhost port 8000')
try:
server.serve_forever()
except KeyboardInterrupt:
print("\nKeyboard interrupt received, exiting.")
server.shutdown()
sys.exit(0)
文档XMLRPC服务器
DocXMLRPCServer
方法:
- set_server_title:设置网页文档页签
<title>标题 - set_server_name:设置网页文档页面标题
- set_server_documentation:设置网页文档说明
多路径XMLRPC服务器
MultiPathXMLRPCServer
XML-RPC 客户端
最简单的客户端代码:
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
print("3 is even: %s" % str(proxy.is_even(3)))
print("100 is even: %s" % str(proxy.is_even(100)))
xmlrpc.client.Binary 对象
服务端返回bytes对象,客户端接受Binary对象,Binary.data是被 Binary实例封装的二进制数据。 该数据以bytes对象的形式提供。
with xmlrpc.client.ServerProxy("http://localhost:15000/") as proxy:
proxy.set('foo', b'Hello World') # 客户端上传字节数据可以直接使用bytes
data = proxy.get('foo')
assert isinstance(data, xmlrpc.client.Binary)
assert data.data == b'Hello World' # 客户端获取字节数据需要通过Binary对象转换
⚠ 警告:一般来讲,不应该将 XML-RPC 服务以公共API的方式暴露出来。 xmlrpc.client 模块对于恶意构建的数据是不安全的。
总结
XML-RPC的一个缺点是它的性能。SimpleXMLRPCServer 的实现是单线程的,所以它不适合于大型程序,尽管它是可以通过多线程来执行的。 另外,由于 XML-RPC 将所有数据都序列化为XML格式,所以它会比其他的方式运行的慢一些。 但是它也有优点,这种方式的编码可以被绝大部分其他编程语言支持。 通过使用这种方式,其他语言的客户端程序都能访问你的服务。

浙公网安备 33010602011771号