作者:王恩建来源:http://www.sentom.netxml-rpc 是工作在 internet 上的远程过程调用协议。通俗点讲,就是使用 http 协议交互,交互的载体是 xml 文件。xml-rpc 具体的规范说 明请参考这里。
图片来自xml-rpc官方网站
xml-rpc 规范定义了六种数据类型,下表是这六种数据类型与 java 的数据类型对应表。
xml-rpcjava<i4> 或 <int>int<boolean>boolean<string>java.lang.string<double>double<datetime.iso8601>java.util.date<struct>java.util.hashtable<array>java.util.vector<base64>byte[ ]
xml-rpc 规范的各种平台都有具体实现,xml-rpc 规范的 java 实现都有好几种,这里我们选择了 apache xml-rpc。
xml-rpc 服务端实现先定义一个简单业务对象 myhandler,远程客户端将调用该对象的方法,具体代码如下:
package net.sentom.xmlrpc;public class myhandler { public string sayhello(string str){ return "hello," + str; }}
然后定义一个 servlet 名叫 myxmlrpcserver,远程客户端通过 http-post 访问该 servlet。
package net.sentom.xmlrpc;import java.io.ioexception;import java.io.outputstream;import javax.servlet.servletexception;import javax.servlet.http.httpservlet;import javax.servlet.http.httpservletrequest;import javax.servlet.http.httpservletresponse;import org.apache.xmlrpc.xmlrpcserver;public class myxmlrpcserver extends httpservlet { public void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { xmlrpcserver xmlrpc = new xmlrpcserver(); xmlrpc.addhandler("myhandler", new myhandler()); byte[] result = xmlrpc.execute(request.getinputstream()); response.setcontenttype("text/xml"); response.setcontentlength(result.length); outputstream out = response.getoutputstream(); out.write(result); out.flush(); }}
需要特别说明是:
xmlrpc.addhandler("myhandler", new myhandler());
为了便于理解,这里可以看成普通的:
myhandler myhandler = new myhandler();
最后在web.xml文件中加入以下几行:
<servlet> <servlet-name>myxmlrpcserver</servlet-name> <servlet-class>net.sentom.xmlrpc.myxmlrpcserver</servlet-class></servlet><servlet-mapping> <servlet-name>myxmlrpcserver</servlet-name> <url-pattern>/myxmlrpcserver</url-pattern></servlet-mapping>
xml-rpc 客户端实现客户端相对简单一些,先来一个 java 客户端实现 myxmlrpcclient:
package net.sentom.xmlrpc;import java.io.ioexception;import java.net.malformedurlexception;import java.util.vector;import org.apache.xmlrpc.xmlrpcclient;import org.apache.xmlrpc.xmlrpcexception;public class myxmlrpcclient { public static void main(string[] args) { try { xmlrpcclient xmlrpc = new xmlrpcclient("http://localhost:8080/xmlrpc/myxmlrpcserver"); vector params = new vector(); params.addelement("tom"); string result = (string) xmlrpc.execute("myhandler.sayhello",params); system.out.println(result); } catch (malformedurlexception e) { system.out.println(e.tostring()); } catch (xmlrpcexception e) { system.out.println(e.tostring()); } catch (ioexception e) { e.printstacktrace(); } }
http://localhost:8080/xmlrpc/myxmlrpcserver 为 myxmlrpcserver 的访问url。
string result = (string) xmlrpc.execute("myhandler.sayhello",params);
再来一个 python 客户端实现
import xmlrpcliburl = http://localhost:8080/xmlrpc/myxmlrpcserver;server = xmlrpclib.server(url);print server.myhandler.sayhello(tom);
