Apache xml-rpc入門

  由於最近做的一個項目需要,使用了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
<i4> or <int> java.lang.Integer int
<boolean> java.lang.Boolean boolean
<string> java.lang.String java.lang.String
<double> java.lang.Double double
<dateTime.iso8601> java.util.Date java.util.Date
<struct> java.util.Hashtable java.util.Hashtable
<array> java.util.Vector java.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>);     即可

發佈了56 篇原創文章 · 獲贊 10 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章