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))