第十二章:互联网-xmlrpc.client:XML-RPC的客户库-连接服务器
作者:互联网
12.10 xmlrpc.client:XML-RPC的客户库
XML-RPC是一个轻量级远程过程调用协议,建立在HTTP和XML之上。xmlrpclib模块允许Python程序与使用任何语言编写的XML-RPC服务器通信。这一节中的所有例子都使用了xmlrpc_server.py中定义的服务器,可以在源发布包中找到,这里给出这个服务器以供参考。
# xmlrpc_server.py
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.client import Binary
import datetime
class ExampleService:
def ping(self):
"""Simple function to respond when called
to demonstrate connectivity.
"""
return True
def now(self):
"""Returns the server current date and time."""
return datetime.datetime.now()
def show_type(self,arg):
"""Illustrates how types are passed in and out of
server methods.
Accepts one argument of any type.
Returns a tuple with string representation of the value,
the name of the type,and the value itself.
"""
return (str(arg),str(type(arg)),arg)
def raises_exception(self,msg):
"Always raises a RuntimeError with the message passed in."
raise RuntimeError(msg)
def send_back_binary(self,bin):
"""Accepts a single Binary argument, and unpacks and
repacks it to return it."""
data = bin.data
print('send_back_binary({!r})'.format(data))
response = Binary(data)
return response
if __name__ == '__main__':
server = SimpleXMLRPCServer(('localhost',9000),
logRequests=True,
allow_none=True)
server.register_introspection_functions()
server.register_multicall_functions()
server.register_instance(ExampleService())
try:
print('Use Control-C to exit')
server.serve_forever()
except KeyboardInterrupt:
print('Exiting')
12.10.1 连接服务器
要将一个客户端连接到服务器,最简单的方法是实例化一个ServerProxy对象,为它指定服务器的URI。例如,演示服务器在localhost的端口9000上运行。
import xmlrpc.client
server = xmlrpc.client.ServerProxy('http://localhost:9000')
print('Ping:',server.ping())
在这种情况下,服务的ping()方法没有任何参数,它会返回一个布尔值。
运行结果:
还可以有其他选项支持其他类型的传输以便连接服务器。HTTP和HTTPS已经明确得到支持,二者都提供基本认证。要实现一个新的通信通道,只需要一个新的传输类。例如,可以在SMTP之上实现XML-RPC,这是一个很有意思的训练。
import xmlrpc.client
server = xmlrpc.client.ServerProxy('http://localhost:9000',
verbose=True)
print('Ping:',server.ping())
指定verbose选项会提供调试信息,这对于解决通信错误很有用。
运行结果:
如果需要其他系统,则可以将默认编码由UTF-8改为其他编码。
import xmlrpc.client
server = xmlrpc.client.ServerProxy('http://localhost:9000',
encoding='ISO-8859-1')
print('Ping:',server.ping())
服务器会自动检测正确的编码。
运行结果:
allow_none选项会控制Python的None值是自动转换为nil值还是会导致一个错误。
import xmlrpc.client
server = xmlrpc.client.ServerProxy('http://localhost:9000',
allow_none=False)
try:
server.show_type(None)
except TypeError as err:
print('ERROR:',err)
server = xmlrpc.client.ServerProxy('http://localhost:9000',
allow_none=True)
print('Allowed:',server.show_type(None))
如果客户不允许None,则会在本地产生一个错误,不过如果未配置允许None,那么也有可能从服务器产生错误。
运行结果:
标签:XML,xmlrpc,server,RPC,client,import,print,服务器 来源: https://blog.csdn.net/weixin_43193719/article/details/91350242