roller扩展开发经验小结之xmlrpc

roller扩展开发经验小结之xmlrpc

去年10月为了满足一个客户的需求,让我开发一个教学博客系统出来,当时考虑节约成本就使用了一个比较优秀的开源博客平台来做二次开发。这个开源平台就是 roller,是apache的一个项目,能收录在apache下面说明还是有两把刷子的,matrix的部落隔就是直接使用的roller,而且看到确切消息说网易的博客平台也是基于roller进行开发的。
roller地址:http://roller.apache.org/
现在教学博客平台已近开发完成投入使用了,而在这个过程中发现了roller确实有很多地方值得一个jee开发人员借鉴的地方,所以今天开始打算把学到的这些经验进行一下总结了。好久没写blog了,前段时间确实太忙了,事情太多了。现在打算每天挤点时间把这些经验都记录下来,不然我怕日子久了我都忘记了。
首先先讲的是xmlrpc,rpc的全称是Remote Procedure Call,实际上就是为了让客户端可以轻松的对服务端的一些方法啊,过程进行调用。xmlrpc其实是一个使用xml来实现rpc的规范,使用的传输协议还是我们最熟悉的http,不同的是传输的格式是使用xml的格式来封装数据的,而不是使用html了。基于这个规范呢其实是有多种实现的,由php的,有Python的。在这里我要介绍的是roller中所使用的一个实现,依然是apache下的一个项目Apache XML-RPC:http://ws.apache.org/xmlrpc/。
在roller中使用的是xmlrpc的服务段,所以下面我先介绍服务端和客户端的设置以及调用方法
1、当然是把Apache XML-RPC的包引入到服务端和客户段
客户端引入:xmlrpc-common.jar  xmlrpc-client.jar
服务端引入:xmlrpc-common.jar  xmlrpc-server.jar

2、使用java的实现当然要有一个servlet了,
先介绍客户端:遵循http协议,客户端针对一个url发送请求
下面是相关代码
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

public class RpcClient {
   public static void main(String[] args) throws Exception {
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
XmlRpcClient client = new XmlRpcClient();
       try {
            config.setServerURL(new URL("http://127.0.0.1:8088/roller-services/xmlrpc"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        config.setBasicUserName("user");
        config.setBasicPassword("pwd");
        config.setEnabledForExtensions(true);
        config.setConnectionTimeout(60 * 1000);
        config.setReplyTimeout(60 * 1000);

        // set configuration
        client.setConfig(config);

   }
}

再介绍服务端:服务端自然要有一个servlet来接受这个请求了
在web.xml中配置servlet
<!--XmlRpc servlet-->
<servlet>
    <servlet-name>XmlRpcServlet</servlet-name>
    <servlet-class>org.apache.xmlrpc.webserver.XmlRpcServlet</servlet-class>
    <init-param>
        <param-name>enabledForExtensions</param-name>
        <param-value>true</param-value>
        <description>Sets, whether the servlet supports vendor extensions for XML-RPC.</description>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>XmlRpcServlet</servlet-name>
    <url-pattern>/roller-services/xmlrpc</url-pattern>
</servlet-mapping>
这里的配置我使用的是默认的servlet,当然你也可以使用自己定义的servlet了,我的需求比较简单,所以就没有再另外定义servlet


3、下面就是客户端根据需求发送自己特定的rpc请求了,比如我需要获取服务端所有的blogList
客户端的调用代码如下:
        try {
          Object[] result = (Object[]) client.execute("blogger.getAllblogList",
                params);
        } catch (Exception e) {
            e.printStackTrace();
        }
那么服务段又是如何处理这个请求的呢?上面那个servlet会把请求根据不同rpc请求转发给不同的处理器,不过由于servlet我使用的是默认的,所以分发这个动作是使用配置properties文件来实现的,这里有个不好的地方要说明的是配置文件必须在项目的/org/apache/xmlrpc /webserver/XmlRpcServlet.properties路径下,这个是Apache XML-RPC做得不好的一个地方。配置文件内容如下
blogger=org.apache.roller.webservices.xmlrpc.BloggerAPIHandler
metaWeblog=org.apache.roller.webservices.xmlrpc.MetaWeblogAPIHandler
当服务端接受到上面客户端的请求之后,就会根据blogger到BloggerAPIHandler去调用getAllblogList这个方法。

4 最后一步就是给客户端回传数据了
这里需要注意的是服务端一般使用的是Hashtable来对多个数据进行封装,比如:
     Hashtable result = new Hashtable();
            result.put("nickname", user.getUserName());
            result.put("userid", user.getUserName());
            result.put("email", "");
            result.put("lastname", lastname);
            result.put("firstname", firstname);          
            return result;
但是客户端在解析的时候取出来的也是一个Hashtable,然后从中取出自己需要的数据了。
       HashMap table = (HashMap) obj;
       this.nickname = table.get("nickname").toString();
       this.userid = table.get("userid").toString();
当然,最好是做一个专门的解析类来对数据进行解析了。
这里需要补充说明的是,Apache XML-RPC传输的数据类型是一些预先定义好的数据类型,但是同时它也支持用户自定义的数据类型,
具体可以参见:http://ws.apache.org/xmlrpc/advanced.html

你可能感兴趣的:(apache,xml,PHP,servlet,python)