zoukankan      html  css  js  c++  java
  • XML-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)

  • 相关阅读:
    http请求消息体和响应消息体
    整型常量
    C语言中字符串后面的'\0'
    String类
    二进制转成十六进制
    http消息头
    NULL和NUL
    拷贝构造函数和赋值表达式
    awk中的FS
    之前给女性网增加的一个滚动展示
  • 原文地址:https://www.cnblogs.com/cc11001100/p/7266387.html
Copyright © 2011-2022 走看看