XML-RPC 是一种比 SOAP 更早的、简单的轻量级 Web 服务技术,是 XML Web 服务的鼻祖。它是一个用于远程过程调用(remote procedure call,RPC)的简单规范,这种调用使用 HTTP 作为传输协议,并使用 XML 词汇表作为消息有效负载。由于 XML-RPC 非常简单(整个规范打印出来还不到十页纸)。
XML-RPC 数据类型
XML-RPC 标签 描述
< string > 字符的一个序列
< int > 有符号或无符号 32-bit 整数值
< boolean > true(1)或 false(0)
< double > 有符号双精度浮点数
< dateTime.iso8601 > 日期和时间(当没有时区)
< base64 > 一个 base64 编码的字符串
< array > 一个数据类型序列的容器
< struct > 一个关键字-值对的容器
XML-RPC之Hello World:
处理器类:
package org.sun.rpc.handler;
public class HelloHandler {
public String sayHello(String name) {
return "Hello, " + name;
}
}
Server端:
package org.sun.rpc.server;
import java.io.IOException;
import org.apache.xmlrpc.XmlRpcException;
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 org.sun.rpc.handler.HelloHandler;
public class HelloServer {
public static final int PORT = 8080;
public static void main(String... args) throws XmlRpcException, IOException {
System.out.println("Starting RPC Server Now ...");
WebServer webServer = new WebServer(PORT);
XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
PropertyHandlerMapping handlerMapping = new PropertyHandlerMapping();
handlerMapping.addHandler("hello", HelloHandler.class);
xmlRpcServer.setHandlerMapping(handlerMapping);
XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
serverConfig.setEnabledForExtensions(true);
serverConfig.setContentLengthOptional(false);
webServer.start();
System.out.println("Registered HelloHandler to \"hello\"");
System.out.println("Now Accepting Requests ...");
}
}
Client端:
package org.sun.rpc.client;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory;
public class HelloClient {
public static void main(String... args) throws MalformedURLException, XmlRpcException {
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(new URL("http://127.0.0.1:8080/"));
XmlRpcClient client = new XmlRpcClient();
client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));
client.setConfig(config);
Object[] params = new Object[] { "Jacky" };
String result = (String) client.execute("hello.sayHello", params);
System.out.println("Response from server is: " + result);
}
}
代码使用apache-xmlrpc库。
底层的处理:
sayHello()方法的请求实际被转换成一个HTTP调用,服务端解析XML文件后如果有匹配的方法将相应结果编码成XML文件。