• Apache xmlrpc


    由于最近做的一个项目需要,使用了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了解。

  • 相关阅读:
    构造函数与其他方法的区别
    记录点复习题目和linux学习
    找点面试题目
    linux代码常用查询!!!!!!!!!!!!
    python复习
    明天面试今天赶紧准备下
    文都计算机考研课程
    是时候刷笔试题目了
    倒排索引
    总结算法课程
  • 原文地址:https://www.cnblogs.com/kentyshang/p/627778.html
Copyright © 2020-2023  润新知