Apache xml-rpc入门

本文介绍了Apache XML-RPC的基本概念及其使用方法,包括客户端和服务器端的设置、不同类型的支持及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  由于最近做的一个项目需要,使用了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 typeData Types generated by the ParserTypes expected by the Invoker as input parameters of RPC handlers
<i4> or <int>java.lang.Integerint
<boolean>java.lang.Booleanboolean
<string>java.lang.Stringjava.lang.String
<double>java.lang.Doubledouble
<dateTime.iso8601>java.util.Datejava.util.Date
<struct>java.util.Hashtablejava.util.Hashtable
<array>java.util.Vectorjava.util.Vector
<base64>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(<servletURL>);     即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值