[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格式,所以它会比其他的方式运行的慢一些。 但是它也有优点,这种方式的编码可以被绝大部分其他编程语言支持。 通过使用这种方式,其他语言的客户端程序都能访问你的服务。

posted @ 2025-08-03 19:45  hd092336  阅读(26)  评论(0)    收藏  举报