Python中关于XML-RPC原理

转自http://www.cnblogs.com/wanghaoran/p/3189017.html


SimpleXMLRPCServer模块为XML-RPC服务端的写入提供了一个基本的框架。利用SimpleXMLRPCServer服务器既可以一直空闲,也可以利用CGIXMLRPCRequestHandler来嵌入到一个CGI环境中。

XML-RPC(Remote Procedure Call)是通过HTTP传输协议,利用XML格式的远端程序调用方法。客户端可以调用服务端带参数的方法并获取返回的结构数据。(服务端的名字是一个URI)。这个模块支持写入XML-RPC端的代码。它用来处理所有转换的细节在在整合的Python对象和XML报文之间。

Eg1服务端代码:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler

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

server = SimpleXMLRPCServer(("localhost", 8000),requestHandler = RequestHandler)
#server = SimpleXMLRPCServer(("localhost", 8000))
server.register_introspection_functions()

server.register_function(pow)

def adder_function(x,y):
    return x+y
server.register_function(adder_function,'add')

class MyFuncs:
    def div(self, x, y):
        return x//y
server.register_instance(MyFuncs())
server.serve_forever()

Eg1客户端代码:

import xmlrpclib

s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.pow(2,3)
print s.add(2,3)
print s.div(5,2)

print s.system.listMethods()

XML_RPC服务端创建步骤:
1、 导入SimpleXMLRPCServer模块
2、 实例化一个XML-RPC服务对象,在指定的端口监听请求
server = SimpleXMLRPCServer((“localhost”, 8000))
3、 对函数的定义并把该函数注册到server端
server.register_function(adder_function,’add’)##adder_function是服务点定义的函数,add是客户端调用时用的函数。
server.register_introspection_functions()##如果用到内部函数,需要把内部函数注册到服务端。
server.register_instance(MyFuncs())##如果要注册的是一个类,可以利用这个函数把类中的方法全部注册到server端。
4、服务端开始监听运行server.serve_forever()
XML_RPC客户端创建步骤:
1、 导入xmlrpclib库模块
2、 创建一个代理到服务端
proxy = xmlrpclib.ServerProxy(‘http://localhost:8000‘)##函数参数是URL格式
3、通过代理就可以调用服务端的方法。

Eg2服务端代码:

import datetime
from SimpleXMLRPCServer import SimpleXMLRPCServer
import xmlrpclib

def today():
    today = datetime.datetime.today()
    return xmlrpclib.DateTime(today)
def add(x,y):
    return x+y
def subtract(x,y):
    return x-y
def multiply(x,y):
    return x*y
def divide(x,y):
    return x/y

server = SimpleXMLRPCServer(("localhost", 8001))
print "Listening on port 8001..."
server.register_multicall_functions()
server.register_function(today, "today")
server.register_function(add, "add")
server.register_function(subtract, "subtract")
server.register_function(multiply, "multiply")
server.register_function(divide, "divide")
server.serve_forever()

注意:
server.register_multicall_functions()##这个函数的作用是可以使客户端同时调用服务端的的多个函数。

Eg2客户端代码:

import xmlrpclib
import datetime

proxy = xmlrpclib.ServerProxy("http://localhost:8001/")

print proxy.add(7,3)
print proxy.subtract(7,3)
print proxy.multiply(7,3)
print proxy.divide(7,3)
today = proxy.today()
multicall = xmlrpclib.MultiCall(proxy)
multicall.today()
multicall.add(7,3)
multicall.subtract(7,3)
multicall.multiply(7,3)
multicall.divide(7,3)
result = multicall()

# convert the ISO8601 string to a datetime object
converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
print "Today: %s" % converted.strftime("%d.%m.%Y, %H:%M")
print "Today1: %s, 7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result)

注意:
multicall = xmlrpclib.MultiCall(proxy)
……
result = multicall()##将这两个函数之间的返回值写入到result中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值