由于最近做的一个项目需要,使用了apache xml-rpc,顺便整理一下使用的方法。
xml-rpc是一套允许运行在不同操作系统、不同环境的程序实现基于internet过程调用的规范和一系列的实现。这种远程过程调用使用http作为传输协议,xml作为传送信息的编码格式。xml-rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。
关于xml-rpc更详细的信息,请参阅http://www.xmlrpc.com。1,客户程序
Apache xml-rpc提供两种客户类:
org.apache.xmlrpc.XmlRpcClient:使用java.net.URLConnection。
org.apache.xmlrpc.XmlRpcClientLite:自身提供轻量级的http client实现。
如果您需要完全的http支持(例如:代理,重定向等等),你应该使用XmlRpcClient。反之,如果您不需要完全的http支持并且更注重性能,那么你应该仔细的试验这两种客户类。在某些平台上,可能XmlRpcClient更快,但是在某些平台上XmlRpcClientLite更快。
这两个客户类提供相同的接口。在客户端使用apache xml-rpc是非常简单的,只需要完成下面的简单工作:
// 建立xml-rpc客户
XmlRpcClient client = new XmlRpcClient("http://" + server + ":" + port);// 设置调用参数
Vector params = new Vector();
params.addElement(name);// 调用并取得结果
String result = (String) client.execute("hello.sayHello", params);如果您需要进行异步调用,并使用executeAsync()方法。
2,登记Handler Object
org.apache.xmlrpc.XmlRpcServer和org.apache.xmlrpc.WebServer都提供方法以登记/注销Handler Object:
addHandler (String name, Object handler);
removeHandler (String name);3,在servlet环境中使用xml-rpc
典型的代码如下所示:
XmlRpcServer xmlrpc = new XmlRpcServer ();
xmlrpc.addHandler ("examples", new ExampleHandler ());
...
byte[] result = xmlrpc.execute (request.getInputStream ());
response.setContentType ("text/xml");
response.setContentLength (result.length());
OutputStream out = response.getOutputStream();
out.write (result);
out.flush ();
请注意:execute方法不会返回任何异常,因为所有错误都被编码成xml返回可以端。4,使用内建的http server
代码如下:
XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");//start the server
System.out.println("Starting XML-RPC Server......");WebServer server = new WebServer(8585);
//register our handler class
server.addHandler("hello", new HelloHandler());
server.start();5,Apache xml-rpc支持的类型
这些类型适用于xml-rpc的参数和返回类型,同时,如果参数或者返回类型是集合类型的话,也适用于集合元素。
XML-RPC data type Data Types generated by the Parser Types expected by the Invoker as input parameters of RPC handlers or java.lang.Integer int java.lang.Boolean boolean java.lang.String java.lang.String java.lang.Double double java.util.Date java.util.Date java.util.Hashtable java.util.Hashtable java.util.Vector java.util.Vector
byte[ ] byte[ ]
6,使用内建http server的简单例子
a,建立handler object/*
* 创建日期 2004-5-12
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package helloxmlrpc;
import java.util.Vector;
/**
* @author fyun
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class HelloHandler {
public String sayHello(String name) {
return "Hello " + name;
}
}b,登记并启动server
/*
* 创建日期 2004-5-12
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package helloxmlrpc;
/**
* @author fyun
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
import org.apache.xmlrpc.*;
public class HelloServer {
public static void initServer() {
try {
XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
//start the server
System.out.println("Starting XML-RPC Server......");
WebServer server = new WebServer(8585);
//register our handler class
server.addHandler("hello", new HelloHandler());
server.start();
System.out.println("Now accepting requests......");
} catch (ClassNotFoundException e) {
System.out.println("Could not locate SAX Driver");
}
}
public static void main(String[] args){
initServer();
}
}
c,客户程序
/*
* 创建日期 2004-5-12
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package helloxmlrpc;
/**
* @author fyun
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
import java.io.IOException;
import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcClient;
import java.net.MalformedURLException;
import org.apache.xmlrpc.XmlRpcException;
public class HelloClient {
public static void invoke(String server, String port, String name) {
try {
//Use the Apache Xereces SAX Driver
XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
//Specify the server
XmlRpcClient client = new XmlRpcClient("http://" + server + ":" + port);
//create request
Vector params = new Vector();
params.addElement(name);
//make a request and print the result
String result = (String) client.execute("hello.sayHello", params);
System.out.println("hello.sayHello: " + result);
} catch (ClassNotFoundException e) {
System.out.println("Could not locate SAX Driver");
} catch (MalformedURLException e) {
System.out.println(
"Incorrect URL fro xml-rpc server foramt:" + e.getMessage());
} catch (XmlRpcException e) {
e.printStackTrace();
System.out.println("XmlRpcException :" + e.getMessage());
} catch (IOException e) {
System.out.println("IOException:" + e.getMessage());
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
if( args == null || args.length < 2 ){
System.out.println("Usage: java HelloClient [server] [port] [yourname]");
System.exit(1);
}
invoke(args[0], args[1], args[2]);
}
}
7,使用servlet的例子
1,handler object不变
2,建立XmlRpcFacade
package helloxmlrpc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.xmlrpc.XmlRpcServer;
public class XmlRpcFacade {
private static XmlRpcServer xmlrpc;
static{
xmlrpc = new XmlRpcServer();
//登记你的handler object
xmlrpc.addHandler("hello", new HelloHandler());
}
public void execute(HttpServletRequest request, HttpServletResponse response) throws
IOException {
byte[] result = xmlrpc.execute(request.getInputStream());
response.setContentType("text/xml; charset=GB2312");
response.setContentLength(result.length);
OutputStream out = response.getOutputStream();
out.write(result);
out.flush();
out.close();
}
}
3,建立servlet
package hellpxmlrpc;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class XmlRpcServlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK";
private XmlRpcFacade facade;
public void init() throws ServletException {
facade = new XmlRpcFacade();
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
this.doService(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
this.doService(request, response);
}
public void doService(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
facade.execute(request, response);
}
//Clean up resources
public void destroy() {
}
}
4,客户程序和内建http server类似,只需将先下面这句
XmlRpcClient client = new XmlRpcClient("http://" + server + ":" + port);
改为
XmlRpcClient client = new XmlRpcClient();
即可
希望这篇文档能对你有小小帮助。更详细的信息可以到http://ws.apache.org/xmlrpc了解。