Mô tả
XML-RPC là giao thức gọi thủ tục từ xa (Remote Procedure Call) sử dụng XML qua HTTP. Python hỗ trợ sẵn trong thư viện chuẩn: xmlrpc.server và xmlrpc.client.
1. Tạo XML-RPC Server
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler
# Chỉ cho phép path /RPC2
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
with SimpleXMLRPCServer(('localhost', 9000), requestHandler=RequestHandler) as server:
# Đăng ký hàm introspection (system.listMethods, etc.)
server.register_introspection_functions()
# Đăng ký hàm built-in len()
server.register_function(len)
# Đăng ký hàm tùy chỉnh với tên khác
@server.register_function(name='rmndr')
def remainder_function(x, y):
return x // y
# Đăng ký hàm với tên gốc
@server.register_function
def modl(x, y):
return x % y
print("Server đang chạy tại https://localhost:9000/RPC2")
print("Nhấn Ctrl+C để dừng")
server.serve_forever()
2. Tạo XML-RPC Client
import xmlrpc.client
# Kết nối đến server
proxy = xmlrpc.client.ServerProxy('https://localhost:9000/RPC2')
# Gọi các hàm đã đăng ký
print("len('Tutorialspoint'):", proxy.len("Tutorialspoint")) # 14
print("rmndr(12, 5):", proxy.rmndr(12, 5)) # 2
print("modl(7, 3):", proxy.modl(7, 3)) # 1
# Liệt kê tất cả method có sẵn
print("\nAvailable methods:")
print(proxy.system.listMethods())
Đầu ra Client
len('Tutorialspoint'): 14
rmndr(12, 5): 2
modl(7, 3): 1
Available methods:
['len', 'modl', 'rmndr', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']
3. Chạy thử nghiệm
- Mở terminal 1: chạy server
python server.py - Mở terminal 2: chạy client
python client.py
Lưu ý bảo mật
- XML-RPC không có authentication/encryption built-in.
- Chỉ dùng trong mạng nội bộ tin cậy.
- Production: dùng HTTPS, VPN, hoặc thay bằng gRPC/REST API.
Mở rộng: Multi-threaded Server
from xmlrpc.server import SimpleXMLRPCServer
import threading
server = SimpleXMLRPCServer(('localhost', 9000), allow_none=True)
# ... register functions ...
# Chạy trong thread riêng
thread = threading.Thread(target=server.serve_forever)
thread.daemon = True
thread.start()
# Main thread làm việc khác...
# server.shutdown() để dừng