1. 程式人生 > >XML-RPC筆記

XML-RPC筆記

static stream table brush 方法調用 imp property json-rpc 包裝

1.什麽是XML-RPC

RPC(Remote Procedure Call)就是相當於提供了一種“遠程接口”來供外部系統調用,常用於不同平臺、不同架構的系統之間互相調用。

XML-RPC(RPCXML Remote Procedure Call)是通過HTTP傳輸XML來實現遠程過程調用的RPC,因為是基於HTTP、並且使用XML文本的方式傳輸命令和數據,所以兼容性更好,能夠跨域不同的操作系統、不同的編程語言進行遠程過程調用,凡有所得,必有所失,在兼容性好的同時速度也會慢下來。

一般一個RPC系統包括兩個部分,RPC Client和RPC Server,Client向Server發送一個請求體為XML的HTTP POST請求,被調用的方法在Server端執行後將執行結果以XML格式返回,與平常的方法調用所不同就是接口“作用域”更大,並且多了一層數據的包裝和轉換(見本文最後的數據類型)。

2. XML-RPC實現

Apache XML-RPC是XML-RPC的一個Java實現,其底層是基於Helma的。

XML-RPC Server端

啟動一個XML-RPC有兩種方式,一種是集成在Web Servlet環境中,一般應用在Web環境;一種是啟動獨立的內嵌Web Server,內嵌的Web Server可以被嵌入到任意的Java應用中。

集成在Web Servlet

使用內嵌的Web Server

package org.cc11001100.xmlrpc;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.server.XmlRpcStreamServer;
import org.apache.xmlrpc.webserver.WebServer;

import java.io.IOException;

public class XmlRpcServerDemo {

    public static void main(String[] args) throws IOException, XmlRpcException {

        WebServer webServer = new WebServer(8088);

        XmlRpcStreamServer xmlRpcServer = webServer.getXmlRpcServer();

        // 調用映射相關配置
        PropertyHandlerMapping propertyHandlerMapping = new PropertyHandlerMapping();
        propertyHandlerMapping.load(Thread.currentThread().getContextClassLoader(), "xml-rpc.properties");
        xmlRpcServer.setHandlerMapping(propertyHandlerMapping);

        // Server相關配置
        XmlRpcServerConfigImpl xmlRpcServerConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
        xmlRpcServerConfig.setEnabledForExceptions(true);
        xmlRpcServerConfig.setContentLengthOptional(false);

        // 設置ACL
        webServer.setParanoid(true);
        webServer.acceptClient("127.0.0.1");
//        webServer.denyClient("192.168.1.*");

        webServer.start();

    }

}

xml-rpx.properties文件內容:

# XML-RPC配置文件
        
FooUtils = org.cc11001100.xmlrpc.FooUtils

XML-RPC Client端

客戶端有兩種調用方式,分別是同步調用和異步調用。

同步調用

package org.cc11001100.xmlrpc;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

public class XmlRpcClientDemo {

    public static void main(String[] args) throws XmlRpcException, MalformedURLException {

        final String RPC_SERVER = "http://127.0.0.1:8088";

        XmlRpcClient xmlRpcClient = new XmlRpcClient();

        // 客戶端相關配置
        XmlRpcClientConfigImpl xmlRpcClientConfig = new XmlRpcClientConfigImpl();
        xmlRpcClientConfig.setServerURL(new URL(RPC_SERVER));
        xmlRpcClient.setConfig(xmlRpcClientConfig);

        // 調用Server端方法
        String result = (String) xmlRpcClient.execute("FooUtils.sayHello", new ArrayList());
        System.out.println(result);

    }


}

異步調用

比如某個被調用的遠程過程執行的很慢,就可能會導致我們的程序處於假死狀態,又或者我們只是調用它一下,對其返回結果並不是很關心,這個時候比較適合使用異步調用。

XML-RPC數據類型

Tag Java Type Describe
<i4> | <int> Integer/int 4字節帶符號整數值
<boolean> Boolean 0==false, 1==true
<string> String 字符串
<double> Double 雙精度帶符號浮點值
<dateTime.iso8601> java.util.Date 日期/時間
<base64> byte[] base64編碼的二進制數據
<struct> java.util.Map <K,V>對,key必須是string類型,value可以是任意其它類型,struct是可以遞歸使用的
<array> java.lang.Object[] | java.util.List 對象數組

參考資料:

1. Apache XML-RPC http://ws.apache.org/xmlrpc/xmlrpc2/

2. JSON-RPC(使用JSON格式的RPC)

XML-RPC筆記