写点什么

Python XML-RPC 实现简单的远程调用过程

作者:宇宙之一粟
  • 2022 年 7 月 02 日
  • 本文字数:1743 字

    阅读完需:约 6 分钟

Python XML-RPC实现简单的远程调用过程

0 前言


RPC 是 Remote Procedure Call 的缩写,翻译成中文为:远程方法调用。


在 Python 中,我们可以使用 XML-RPC 协议创建自己的跨平台,独立于语言的服务器。XML Remote Procedure Call,即 XML 远程方法调用。


XML-RPC 发表于 1998 年,它是一套允许运行在不同操作系统、不同环境的程序实现基于 Internet 过程调用的规范和一系列的实现。这种远程过程调用使用 http 作为传输协议,XML 作为传送信息的编码格式。


XML-RPC 的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。XML- RPC(http://www.xmlrpc.com)是由 UserLand Software(UserLand Software)的 Dave Winer 及 Microsoft 共同发表[2]。后来在新的功能不断被引入下,这个标准慢慢演变成为今日的 SOAP 协定。


XML-RPC 是一种远程过程调用方法,它使用通过 HTTP 传递的 XML 作为载体。 有了它,客户端可以在远程服务器上调用带参数的方法(服务器以 URI 命名)并获取结构化的数据。


简单的理解是:将数据定义为 XML 格式,通过 HTTP 协议进行远程传输。


1 服务器

在 Python 中,xmlrpc 模块是一个集合了 XML-RPC 服务端与客户端实现模块的包。 这些模块是:


我们使用 SimpleXMLRPCServer 来创建 SimpleXMLRPCSERVER 实例,并告诉它以侦听传入请求。接下来,我们将某些功能定义为服务的一部分并注册这些功能,以便服务器知道如何调用它。


创建一个 xmlrpc_server.py 文件。下面的示例中,我们使用 SimpleXMLRPCServer 实例创建服务器,并注册一些预定义和自定义功能。最后,我们将服务器放入无限的循环接收和响应请求中。 


from xmlrpc.server import SimpleXMLRPCServerfrom xmlrpc.server import SimpleXMLRPCRequestHandler

class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)

with SimpleXMLRPCServer(('localhost', 9000), requestHandler=RequestHandler) as server: server.register_introspection_functions() # Register len() function; server.register_function(len)
# Register a function under a different name @server.register_function(name='rmndr') def remainder_function(x, y): return x // y
# Register a function under function.__name__. @server.register_function def modl(x, y): return x % y server.serve_forever()
复制代码


XML-RPC 可以让我们很容易的构造一个简单的远程调用服务。你所需要做的仅仅是创建一个服务器实例, 通过它的方法 register_function() 来注册函数,然后使用方法 serve_forever() 启动它。


一旦启动了上述服务器,就可以通过客户端程序来调用,该程序可以参考函数并进行函数调用。


2 运行客户端

创建一个 xmlrpc_client.py 文件:

import xmlrpc.client
s = xmlrpc.client.ServerProxy('http://localhost:9000')
print(s.len("Yuzhou1su"))print(s.rmndr(1024,128))print(s.modl(7,3))
# Print list of available methodsprint(s.system.listMethods())
复制代码


在终端中能看到如下输出

$ python xmlrpc_client.py 981['len', 'modl', 'rmndr', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']
复制代码
  • 第一个结果:字符串 Yuzhou1su 长度为 9

  • 第二个结果:1024 除以 128 的整除结果为 8

  • 第三个结果:7 除以 3 的余数为 1

  • 最后一行:输出系统方法

总结


XML-RPC 的缺点:

  • 它的性能不高

  • 不支持其他数据格式的传输。以及 XML-RPC 会将所有的数据序列化为 XML 格式,因此就会比其他的方法要慢一些

  • 而且其不能安全防范恶意构建的数据。


XML-RPC 的优点:

  • 传输复杂的数据。

  • 通过程序语言的封装,实现远程对象的调用。


但是,这种简单的编码的优势在于许多其他的编程语言都能够理解。使用

XML-RPC 的话,客户端程序就可以采用 Python 之外的语言来编写,同样可以访问你

的服务。


抛开 XML-RPC 的局限性不说,如果需要以快速但并不完善(quick and dirty)的方式

实现一个远端过程调用系统,那么了解一下 XML-RPC 还是很值得的。很多时候简单

的方案就已经足够好了。另外,JSON-RPC 的原理与其类似。



发布于: 刚刚阅读数: 3
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020.05.07 加入

🏆InfoQ写作平台-第二季签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于软件工程师,弹性不加班 热衷分享,执着于阅读写作,佛系不水文

评论

发布
暂无评论
Python XML-RPC实现简单的远程调用过程_Python_宇宙之一粟_InfoQ写作社区