【Python】常用模块:xmlrpc

1、xmlrpc是什么?

xmlrpc 是一套基于 HTTP+XML 格式的轻量级远程过程调用协议;

客户端调用本地函数的写法,实际去调用另一台服务器上的函数;

数据全部用 XML 封装传输,可以实现跨语言通信;

2、客户端和服务端

Python 内置模块包含客户端和服务端:

  • xmlrpc.client 客户端,例如:ServerProxy
  • xmlrpc.server 服务端,例如:SimpleXMLRPCServer

2.1 服务端示例

以 SimpleXMLRPCServer 为例;

运行本地 TCP HTTP 服务:注册普通函数、实例方法,供客户端远程调用

python 复制代码
from xmlrpc.server import SimpleXMLRPCServer

def add(a, b):
    return a + b

if __name__ == "__main__":
    server = SimpleXMLRPCServer(("0.0.0.0", 8080), allow_none=True)
    server.register_function(add, "add")
    server.serve_forever()

其它内置服务:

  • DocXMLRPCServer:继承 SimpleXMLRPCServer 额外自带自动文档页面;
    浏览器访问端口可以直接查看所有可调用接口、参数说明,调试非常方便
  • MultiPathXMLRPCServer:支持多路径

2.2 客户端示例

以 ServerProxy 为例,连接远程服务器,调用远程服务器中注册的方法

python 复制代码
from xmlrpc.client import ServerProxy
proxy = ServerProxy("http://127.0.0.1:8080", allow_none=True)
res = proxy.add(10, 20)
print("10+20 =", res)

3、自定义传输层

3.1 介绍

客户端 ServerProxy 默认使用Python内置的传输层 Transport;

默认 Transport 功能有限:无法自定义超时、请求头、HTTPS、日志、重试逻辑;

自定义 Transport 可以实现哪些功能:

  • 设置请求超时;
  • 添加自定义 HTTP Header;
  • 请求前后加日志、异常重试;
  • 适配 HTTPS;
  • 走网络代理访问外网 RPC 服务

3.2 示例

自定义传输层 LaoerTransport ,需要先继承 Transport,一般重新实现:make_connection

python 复制代码
from xmlrpc.client import Transport, ServerProxy
import http.client

class LaoerTransport(Transport):
    def __init__(self, timeout=3):
        super().__init__()
        self.timeout = timeout

    def make_connection(self, host):
        conn = http.client.HTTPConnection(host, timeout=self.timeout)
        return conn

if __name__ == "__main__":
    trans = LaoerTransport(timeout=2)
    proxy = ServerProxy("http://127.0.0.1:8080", transport=trans, allow_none=True)
    print(proxy.add(5, 6))

3.3 https传输

如果连接https安全服务器,可以使用Python内置的:SafeTransport

python 复制代码
from xmlrpc.client import SafeTransport
proxy = ServerProxy("https://xxx:port", transport=SafeTransport())

3.4 Fault 异常处理

服务端内部出错抛出异常时,客户端可以捕获该异常获取错误码和错误信息

python 复制代码
try:
    proxy.test()
except Fault as e:
    print(e.faultCode, e.faultString)

3.5 Binary 二进制传输

传输二进制数据,比如:图片、视频流、文件等;

需要使用 Binary 包装一层

python 复制代码
from xmlrpc.client import Binary
data = b"123456"
proxy.send_file(Binary(data))
相关推荐
Python图像识别24 分钟前
18-【2027毕设】YOLO11烟雾检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·深度学习·yolo·毕业设计·毕设
FYKJ_201030 分钟前
springboot助农产品销售商城05829-计算机课程设计、毕业设计
java·spring boot·python·mysql·spark·django
Yunovian34 分钟前
AI时代,针对模型与应用,浅谈一下各编程语言
开发语言·c++·人工智能·python·ai·rust·ai编程
weixin_4577600043 分钟前
基于 YOLO11m-Pose 的动物姿态估计系统:从 Animal-Pose 标注到 Python 桌面部署
人工智能·python·深度学习
Ticnix1 小时前
RAG 烂大街?烂大街的只是那条流水线——真正的分水岭在这五处
后端·python·agent
Wx-bishekaifayuan1 小时前
springboot社区扶贫救助管理系统13300-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
小小张说故事2 小时前
LightGBM 入门指南:更快的梯度提升树,Python 实战
后端·python·机器学习
Ticnix2 小时前
RAG 检索不准,九成的锅不在向量——不同文件,就该有不同的入库方案
后端·python·agent
jerryinwuhan2 小时前
python快速入门第二周
python
IT毕设梦工厂2 小时前
计算机毕业设计选题推荐:基于大数据的供应链数据分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hive·hadoop·python·数据分析·spark·课程设计