XML-RPC远程方法调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML-RPC远程方法调用相关的知识,希望对你有一定的参考价值。

一.简介

XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。

它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。 这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。 Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。

xml rpc使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。
一个rpc系统,必然包括2个部分:
  1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;
  2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。
  RPC是Remote Procedure Call的缩写,翻译成中文就是远程方法调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。

 xml rpc的可用版本 
xml rpc client和xml rpc server都有很多版本的实现。一般而言,一个实现版本都会同时实现client/server。但由于都满足xml rpc规范,从理论上讲,任何一个版本的rpc client实现与任何一个版本的rpc server都能配套使用。
更进一步,由于xml rpc以xml文本的方式,使用http协议传输,所以与编程语言无关。例如:rpc client的已实现版本包括了:perl,php,python,c/c++,java,等等;rpc server的实现语言包括perl,java,等。
同一种编程语言所实现的版本也不止一个。例如java版的实现有:

  Marque的xmlrpc现在已经和Redstone XML-RPC Library合并(http://xmlrpc.sourceforge.net/)

  apache的xmlrpc 实现,这个项目隶属于apache web service项目,故URL地址开头为ws.apache(http://ws.apache.org/)下载链接http://archive.apache.org/dist/ws/话说apache真是伟大呀!

  这个网页讲的真是太好了:http://www.tutorialspoint.com/xml-rpc/xml_rpc_quick_guide.htm

  这个网页讲的有点深:http://www.ibm.com/developerworks/cn/webservices/1211_zhusy_rpc/

二.python实现

牛人太多,我已无言。python实现http://blog.csdn.net/abcjennifer/article/details/38393185

创建服务器,构造方法,注册方法

from SimpleXMLRPCServer import SimpleXMLRPCServer
def is_even(n):
    return n%2 == 0
server = SimpleXMLRPCServer(("localhost", 8000))#确定URL和端口
print "Listening on port 8000..."
server.register_function(is_even, "is_even") #注册is_even函数
server.serve_forever()#启动服务器,并使其对这个连接可用

创建客户端,请求方法

import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
print "3 is even: %s" % str(proxy.is_even(3))#客户端调用XML-RPC函数
print "100 is even: %s" % str(proxy.is_even(100))

三.xmlrpc++是C++版的xml-rpc接口实现

四.java大法好,一统天下

apache的XML-RPC似乎发生了很大改变,变得极为严谨。

下面的代码分为服务器端和客户端两部分,故意用了用一句话编程。读之给人一种一气呵成,气贯长虹质感。功能是:服务器端有两个函数add和sub,客户端请求其中之一并传入两个int类型的参数,返回int类型的结果并输出。

服务器端代码:

 

class RPCServer {
	public static void main(String[] args) throws IOException {
		WebServer server = new WebServer(8080);
		server.getXmlRpcServer().setHandlerMapping(new XmlRpcHandlerMapping() {

			@Override
			public XmlRpcHandler getHandler(String handlerName)
					throws XmlRpcNoSuchHandlerException, XmlRpcException {
				switch (handlerName) {
					case "add" :
						return new XmlRpcHandler() {

							@Override
							public Object execute(XmlRpcRequest arg)
									throws XmlRpcException {
								int x = (int) arg.getParameter(0),
										y = (int) arg.getParameter(1);
								return x + y;
							}
						};
					case "sub" :
						return new XmlRpcHandler() {

							@Override
							public Object execute(XmlRpcRequest arg)
									throws XmlRpcException {
								int x = (int) arg.getParameter(0),
										y = (int) arg.getParameter(1);
								return x - y;
							}
						};
					default :
						return null;
				}
			}
		});
		server.start();
	}
}

下面是客户端代码

class RPCClient {
	public static void main(String[] args) throws XmlRpcException {
		XmlRpcClient client = new XmlRpcClient();
		int ans = (int) client.execute(new XmlRpcRequest() {
			int x = 3, y = 6;
			@Override
			public int getParameterCount() {
				return 2;
			}

			@Override
			public Object getParameter(int x) {
				if (x == 0)
					return this.x;
				else
					return this.y;
			}

			@Override
			public String getMethodName() {
				return "add";
			}

			@Override
			public XmlRpcRequestConfig getConfig() {
				XmlRpcClientConfigImpl x = new XmlRpcClientConfigImpl();
				try {
					x.setServerURL(new URL("http://localhost:8080"));
				} catch (MalformedURLException e) {
					e.printStackTrace();
				}
				return x;
			}
		});
		System.out.println(ans);
	}
}

 五.关于metaweblog协议

这个协议应用了xml-rpc,是各大博客统一支持的接口,供用户使用。百度metaweblog会出来一堆的,用这几个函数接口就足以访问博客了。

The following methods are supported:

•blogger.deletePost
•blogger.getUsersBlogs
•metaWeblog.editPost
•metaWeblog.getCategories
•metaWeblog.getPost
•metaWeblog.getRecentPosts
•metaWeblog.newMediaObject
•metaWeblog.newPost

以上是关于XML-RPC远程方法调用的主要内容,如果未能解决你的问题,请参考以下文章

XML-RPC笔记

Python:XML-RPC介绍

python xmlrpc模块

通过XML-RPC发送远程信号

如何从 PHP 访问 XML-RPC 数据?

JSON-RPC轻量级远程调用协议介绍及使用