XML-RPC远程方法调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML-RPC远程方法调用相关的知识,希望对你有一定的参考价值。
一.简介
XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。
它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。 这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。 Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。
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远程方法调用的主要内容,如果未能解决你的问题,请参考以下文章