【WEB服务精髓学习笔记二】XML-RPC及java实现

XML-RPC概览

XML-RPC是工作在互联网上的远程程序调用协议。允许软件运行在分布式的系统之上,通过互联网进行软件中程序之间的调用。传输协议是HTTP,所以基于XML-RPC的软件不受操作系统环境、编程语言等限制,而且可以通过防火墙的限制。数据编码格式是XML。
这里写图片描述

XML-RPC的组成

数据模型

一组用于传送参数、返回值和故障(错误信息)的数据类型。
XML-RPC的基本数据类型
(1)int或者i4:4字节整数
(2)double:8字节浮点数
(3)Boolean:true(1)或者false(2)
(4)String:ASCII文本
(5)dateTime:日期CCYYMMDDTHH:MM:SS
(6)base64:以Base64编码的二进制信息(很少用)。
复合数据类型
数组array和结构体struct。

请求结构

一个包含方法和参数信息的 HTTP POST 请求。
XML-RPC 请求是 XML 内容和 HTTP 首部相结合的产物。XML 内容使用数据输
入结构传送参数,并包含用来标识将要调用过程的附加信息,而 HTTP 首部为通
过 Web 传送请求提供包装。
每个请求都只包含一个XML 文档,其根元素是 methodCall元素。每个methodCall元素包含一个methodName元素和一个params元素。methodName元素标识
将调用的过程名,而params元素包含一组参数及相应的值。每个params元素包
含一组 param元素,而每个 param 元素又包含一个 value元素。
例子:
这里写图片描述

响应结构

一个包含返回值或故障信息的 HTTP 响应。
XML-RPC响应只包含一个参数,即使调用的方法未被设计成有返回值,但是它还是会返回一些东西。唯一的方法是返回一个“成功值”(设为true的布尔值)。
如果处理XML-RPC请求时出现了问题,methodResponse元素就会包含一个fault元素,并且不再含有params元素。
例子:
这里写图片描述
这里写图片描述
Content-Type 一定要设为 text/xml,Content-Length首部指定了响应的长度(以字节为单位)。

XML-RPC的java实现

本次需要的XML-RPC框架的下载地址为http://archive.apache.org/dist/ws/xmlrpc/,下载apache-xmlrpc-current-bin.zip后,将lib下面的jar包全部解压到工程目录中,并且为工程添加这些jar包。选择的IDE是eclipse。

XML-RPC服务端的实现

方法一:利用XML-RPC自带的Http Server实现服务器端

采用这种方法时可以任意的命名属性配置文件,当然也可以在程序中指定属性。相对于嵌入到Servlet的方式,这种方式要慢一些。
具体实现步骤:
1,创建一个动态web工程
2,实现运算函数
代码如下:

package calculator;

public class Calculator {
    public int add(int i1, int i2) {  
        return i1 + i2;  
    }  

    public int subtract(int i1, int i2) {  
        return i1 - i2;  
    }
}

3,实现sever
代码如下:

package xmlrpctesting;

import java.net.InetAddress;

import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServer;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.webserver.WebServer;

import calculator.Calculator;
public class XMLRPCServer {
    //XML-RPC的服务器

    public WebServer    web_server;

    public XMLRPCServer()
    {
        try
        {
            this.web_server = new WebServer(10080,
                    InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 })); //设置IP地址和端口号。
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public void initServer()
    {
        XmlRpcServer xmlRpcServer = web_server.getXmlRpcServer(); //get XMLRPC Server Instance
        PropertyHandlerMapping phm = new PropertyHandlerMapping(); //create Handler instance
        try
        {
            //register the class of DbHandler as userData
            phm.addHandler("Calculator", Calculator.class);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        xmlRpcServer.setHandlerMapping(phm);
        XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)xmlRpcServer.getConfig();  
        serverConfig.setEnabledForExtensions(true);//允许做复合类型数据的传输
        serverConfig.setContentLengthOptional(true);
        try
        {
            // start the server
            System.out.println("Attempting to start XML-RPC Server...");
            web_server.start();
            System.out.println("Server is ready, waiting for client calling...");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }


    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        XMLRPCServer mySer = new XMLRPCServer();
        mySer.initServer();
    }
}

启动服务器端的运行结果如图所示:
这里写图片描述

XML-RPC客户端的实现

客户端主要是通过XmlRpcClient类来实现,这是一个无状态的线程安全的类,客户端的配置主要是通过这两个对象来配置:
a. ClientConfig 在这个接口类中设置一些原子属性,比如服务端rul、编码格式等,这个类的实现都是XmlRpcClientConfig的接口实现。
b. TransportFactory 这个接口的任务是创建一个利用客户端的配置信息来与服务端对话的类,这里有两个这样的实现类,一个是创建 java.net里面的类(默认情况下是用这个)来与服务端进行通信,还有一个是利用Jakarta Commons Http Client的实现类。
1,创建一个动态web工程
2,实现client的函数
代码如下:

package userinfo;

import java.net.URL;
import java.util.Scanner;

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

public class UserClient {
    public void methodOne() {
        XmlRpcClient client = new XmlRpcClient();
        XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
        try {
            config.setServerURL(new URL("http://localhost:10080"));//设置服务器端的IP与端口
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        client.setConfig(config);//客户端保存设置
        try {
            //模拟使用在服务器端注册好的对象的实例,进行该对象中的方法访问
            Object[] params = new Object[] { new Integer(31), new Integer(9) };
            Integer result = (Integer) client.execute("Calculator.add", params);
            System.out.println("31+9="+result);
            Integer result2 = (Integer) client.execute("Calculator.subtract", params);
            System.out.println("31-9="+result2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        UserClient myTest = new UserClient();
        myTest.methodOne();

    }
}

在服务器端打开的前提下,运行客户端,效果如下:
这里写图片描述

参考资料

参考的博客
参考书籍为《Web服务精髓》
初入计算机,请大家多多指教嘛,共同学习~~~持续更新中……

猜你喜欢

转载自blog.csdn.net/gongyi_yf/article/details/79588493