XML-RPC是一种使用XML格式编码调用信息、通过HTTP协议传输的远程过程调用协议,Python标准库内置的xmlrpc模块提供了完整的实现,无需额外安装第三方库就可以快速开发XML-RPC的服务端和客户端程序。

XML-RPC服务端开发
服务端的核心是使用xmlrpc.server.SimpleXMLRPCServer创建服务实例,然后注册可以被客户端调用的方法,最后启动服务监听请求。
基础服务端示例
下面是一个简单的服务端实现,提供了加法和获取系统时间两个可调用方法:
from xmlrpc.server import SimpleXMLRPCServer
import datetime
# 创建服务端实例,绑定本地8000端口
server = SimpleXMLRPCServer(("127.0.0.1", 8000))
# 定义供客户端调用的方法
def add(a, b):
return a + b
def get_current_time():
return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 注册方法到服务端
server.register_function(add, "add")
server.register_function(get_current_time, "get_current_time")
# 还可以注册系统内置方法,比如查看已注册的方法列表
server.register_introspection_functions()
print("XML-RPC服务端已启动,监听127.0.0.1:8000")
# 启动服务,持续监听请求
server.serve_forever()
服务端注意事项
- 注册方法时如果不指定第二个参数,默认使用方法本身的名称作为客户端调用的名称
- 服务端方法支持的参数类型包括整数、浮点数、字符串、列表、字典等基础Python数据类型,复杂对象需要先序列化
- 如果需要处理并发请求,可以使用
SimpleXMLRPCServer的多线程版本SimpleXMLRPCServer配合ThreadingMixIn
XML-RPC客户端开发
客户端使用xmlrpc.client.ServerProxy创建代理对象,通过这个对象就可以像调用本地方法一样调用服务端注册的方法。
基础客户端示例
对应上面服务端的客户端实现如下:
import xmlrpc.client
# 创建服务端代理,地址对应服务端的监听地址
proxy = xmlrpc.client.ServerProxy("http://127.0.0.1:8000")
# 调用服务端的add方法
result1 = proxy.add(3, 5)
print(f"3加5的结果是:{result1}")
# 调用服务端的get_current_time方法
result2 = proxy.get_current_time()
print(f"当前服务端时间是:{result2}")
# 调用系统内置方法,查看服务端所有可调用方法
methods = proxy.system.listMethods()
print(f"服务端已注册的方法:{methods}")
客户端异常处理
调用过程中可能出现网络错误、方法不存在、参数类型不匹配等问题,需要添加异常处理逻辑:
import xmlrpc.client
proxy = xmlrpc.client.ServerProxy("http://127.0.0.1:8000")
try:
# 尝试调用不存在的方法
result = proxy.not_exist_method()
except xmlrpc.client.Fault as e:
print(f"服务端返回错误:错误码{e.faultCode},错误信息{e.faultString}")
except ConnectionError:
print("无法连接到服务端,请检查服务端是否启动")
except Exception as e:
print(f"其他异常:{e}")
参数传递与复杂类型处理
XML-RPC支持的基础类型可以直接传递,对于自定义类的实例,需要先转换为字典等可序列化类型再传递:
# 服务端方法,接收字典类型参数
def update_user_info(user_dict):
print(f"收到用户信息:{user_dict}")
return f"用户{user_dict.get('name')}信息更新成功"
# 客户端传递字典参数
proxy = xmlrpc.client.ServerProxy("http://127.0.0.1:8000")
user = {
"id": 1,
"name": "张三",
"age": 25
}
response = proxy.update_user_info(user)
print(response)
常见问题说明
- XML-RPC默认使用HTTP协议,不支持加密传输,如果需要安全传输可以配合HTTPS使用
- 服务端和客户端如果跨语言开发,需要注意不同语言的数据类型映射关系,避免类型不兼容
- 大文件传输不适合使用XML-RPC,因为XML编码会带来较大的额外开销,建议选择其他更适合的传输方案