XML-RPC笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
。
以上是关于XML-RPC笔记的主要内容,如果未能解决你的问题,请参考以下文章