XML-RPC - Quick Guidehttps://www.tutorialspoint.com/xml-rpc/xml_rpc_quick_guide.htm
XML-RPC - 简介
RPC 代表远程过程调用。顾名思义,它是一种调用远程计算机上可用的过程或函数的机制。RPC 是一种比 Web 更古老的技术。实际上,RPC 为开发人员提供了一种定义可通过网络调用的接口的机制。这些接口可以像单个函数调用一样简单,也可以像大型 API 一样复杂。
什么是 XML-RPC?
XML-RPC 是最简单和最简单的 Web 服务方法之一,它使计算机可以轻松地调用其他计算机上的过程。
-
XML-RPC 允许程序通过网络进行函数或过程调用。
-
XML-RPC 使用 HTTP 协议将信息从客户端计算机传递到服务器计算机。
-
XML-RPC 使用一个小的 XML 词汇表来描述请求和响应的性质。
-
XML-RPC 客户端在 XML 请求中指定过程名称和参数,服务器在 XML 响应中返回错误或响应。
-
XML-RPC 参数是类型和内容的简单列表——结构和数组是最复杂的可用类型。
-
XML-RPC 没有对象的概念,也没有包含使用其他 XML 词汇表的信息的机制。
-
然而,通过 XML-RPC 和 Web 服务,Web 变成了程序连接的集合,计算机在这些连接中沿着紧密绑定的路径交换信息。
-
XML-RPC 出现于 1998 年初;它由 UserLand Software 发布,最初在他们的 Frontier 产品中实现。
为什么选择 XML-RPC?
如果您需要集成多个计算环境,但不需要直接共享复杂的数据结构,您会发现 XML-RPC 让您可以快速轻松地建立通信。
即使您在单一环境中工作,您也可能会发现 RPC 方法可以轻松连接具有不同数据模型或处理期望的程序,并且可以轻松访问可重用逻辑。
-
XML-RPC 是用于在计算机之间建立各种连接的出色工具。
-
XML-RPC 为集成商提供了使用标准词汇表和方法来交换信息的机会。
-
XML-RPC 最明显的应用领域是连接不同类型的环境,允许 Java 与 Perl、Python、ASP 等进行对话。
XML-RPC 技术概述
XML-RPC 由三个相对较小的部分组成:
-
XML-RPC 数据模型:一组用于传递参数、返回值和错误(错误消息)的类型。
-
XML-RPC 请求结构:包含方法和参数信息的 HTTP POST 请求。
-
XML-RPC 响应结构:包含返回值或故障信息的 HTTP 响应。
我们将在接下来的三章中研究所有这三个组件。
XML-RPC - 数据模型
XML-RPC 规范定义了六种基本数据类型和两种表示类型组合的复合数据类型。
XML-RPC 中的基本数据类型
类型 | 价值 | 例子 |
---|---|---|
int或 i4 | 介于 - 2,147,483,648 和 2,147,483,647 之间的 32 位整数。 | <int>27</int> <i4>27</i4> |
double | 64 位浮点数 | <double>27.31415</double> <双>-1.1465</双> |
boolean | 真 (1) 或假 (0) | <boolean>1</boolean> <boolean>0</boolean> |
string | ASCII 文本,尽管许多实现支持 Unicode | <string>你好</string> <string>疯了!@</string> |
dateTime.iso8601 | ISO8601 格式的日期:CCYYMMDDTHH:MM:SS | <dateTime.iso8601> 20021125T02:20:04 </dateTime.iso8601> <dateTime.iso8601> 20020104T17:27:30 </dateTime.iso8601> |
base64 | RFC 2045 中定义的以 Base 64 编码的二进制信息 | <base64>SGVsbG8sIFdvcmxkIQ==</base64> |
这些基本类型总是包含在值元素中。字符串(并且只有字符串)可以包含在值元素中,但省略字符串元素。这些基本类型可以组合成两种更复杂的类型,数组和结构。数组表示顺序信息,而结构表示名称-值对,很像哈希表、关联数组或属性。
数组由数组元素指示,该元素包含一个保存值列表的数据元素。与其他数据类型一样,数组元素必须包含在值元素中。例如,以下数组包含四个字符串:
<value>
<array>
<data>
<value><string>This </string></value>
<value><string>is </string></value>
<value><string>an </string></value>
<value><string>array.</string></value>
</data>
</array>
</value>
以下数组包含四个整数:
<value>
<array>
<data>
<value><int>7</int></value>
<value><int>1247</int></value>
<value><int>-91</int></value>
<value><int>42</int></value>
</data>
</array>
</value>
数组还可以包含不同类型的混合,如下所示:
<value>
<array>
<data>
<value><boolean>1</boolean></value>
<value><string>Chaotic collection, eh?</string></value>
<value><int>-91</int></value>
<value><double>42.14159265</double></value>
</data>
</array>
</value>
创建多维数组很简单 - 只需在数组中添加一个数组:
<value>
<array>
<data>
<value>
<array>
<data>
<value><int>10</int></value>
<value><int>20</int></value>
<value><int>30</int></value>
</data>
</array>
</value>
<value>
<array>
<data>
<value><int>15</int></value>
<value><int>25</int></value>
<value><int>35</int></value>
</data>
</array>
</value>
</data>
</array>
</value>
一个简单的结构可能如下所示:
<value>
<struct>
<member>
<name>givenName</name>
<value><string>Joseph</string></value>
</member>
<member>
<name>familyName</name>
<value><string>DiNardo</string></value>
</member>
<member>
<name>age</name>
<value><int>27</int></value>
</member>
</struct>
</value>
通过这种方式,您可以实现任何编程语言支持的几乎所有数据类型。
XML-RPC - 请求格式
XML-RPC 请求是 XML 内容和 HTTP 标头的组合。XML 内容使用数据类型结构来传递参数并包含标识正在调用哪个过程的附加信息,而 HTTP 标头提供了一个用于在 Web 上传递请求的包装器。
每个请求都包含一个 XML 文档,其根元素是一个methodCall 元素。每个methodCall元素都包含一个methodName元素和一个params元素。methodName元素标识要调用的过程的名称,而params元素包含参数及其值的列表。每个params元素都包含一个 param 元素列表,而这些 param 元素又包含value元素。
例如,要将请求传递给名为circleArea的方法,该方法采用Double参数(用于半径),XML-RPC 请求如下所示:
<?xml version="1.0"?>
<methodCall>
<methodName>circleArea</methodName>
<params>
<param>
<value><double>2.41</double></value>
</param>
</params>
</methodCall>
这些请求的 HTTP 标头将反映发送者和内容。基本模板如下所示:
POST /target HTTP 1.0
User-Agent: Identifier
Host: host.making.request
Content-Type: text/xml
Content-Length: length of request in bytes
例如,如果在/xmlrpc上侦听的 XML-RPC 服务器可以使用 circleArea 方法,则请求可能如下所示:
POST /xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169
组装后,整个请求将如下所示:
POST /xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169
<?xml version="1.0"?>
<methodCall>
<methodName>circleArea</methodName>
<params>
<param>
<value><double>2.41</double></value>
</param>
</params>
</methodCall>
这是一个普通的 HTTP 请求,带有精心构建的有效负载。
XML-RPC - 响应格式
响应很像请求,但有一些额外的曲折。如果响应成功——过程被找到、正确执行并返回结果——那么 XML-RPC 响应看起来很像请求,除了methodCall元素被替换为methodResponse元素并且没有methodName元素:
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>18.24668429131</double></value>
</param>
</params>
</methodResponse>
-
一个 XML-RPC 响应只能包含一个参数。
-
该参数可以是数组或结构,因此可以返回多个值。
-
总是需要返回一个值作为响应。“成功值” - 可能是设置为 true (1) 的布尔值。
与请求一样,响应也封装在 HTTP 中并具有 HTTP 标头。即使消息中包含错误,所有 XML-RPC 响应都使用 200 OK 响应代码。标头使用类似于请求的通用结构,一组典型的标头可能如下所示:
HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124
-
XML-RPC 只需要 HTTP 1.0 支持,但兼容 HTTP 1.1。
-
Content-Type 必须设置为 text/xml。
-
Content-Length 标头指定响应的长度(以字节为单位)。
包含标头和响应负载的完整响应如下所示:
HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>18.24668429131</double></value>
</param>
</params>
</methodResponse>
在响应从 XML-RPC 服务器传送到 XML-RPC 客户端后,连接关闭。后续请求需要作为单独的 XML-RPC 连接发送。
XML-RPC - 故障格式
XML-RPC 错误是一种响应。如果在处理 XML-RPC 请求时出现问题,methodResponse元素将包含一个 fault 元素而不是 params 元素。与params元素一样,fault 元素只有一个值来指示出现问题。故障响应可能如下所示:
<?xml version="1.0"?>
<methodResponse>
<fault>
<value><string>No such method!</string></value>
</fault>
</methodResponse>
故障也会有错误代码。XML-RPC 根本不标准化错误代码。您需要查看特定软件包的文档以了解它们如何处理故障。
故障响应也可能如下所示:
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>code</name>
<value><int>26</int></value>
</member>
<member>
<name>message</name>
<value><string>No such method!</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
XML-RPC - 示例
为了演示 XML-RPC,我们将创建一个使用 Java 处理 XML-RPC 消息的服务器,并且我们将创建一个 Java 客户端来调用该服务器上的过程。
对话的 Java 方面使用 Apache XML 项目的 Apache XML-RPC,可在http://xml.apache.org/xmlrpc/获得
将所有 .jar 文件放在适当的路径中,让我们使用 JAVA 创建一个客户端和一个小型 XML-RPC 服务器。
XML-RPC 客户端
让我们编写一个 XML-RPC 客户端来调用一个叫做sum函数的函数。该函数接受两个参数并返回它们的总和。
import java.util.*;
import helma.xmlrpc.XmlRpcClient;
public class JavaClient {
public static void main(String[] args) {
try {
XmlRpcClient client = new XmlRpcClient("http://localhost:8080/RPC2");
Vector params = new Vector();
params.addElement(new Integer(17));
params.addElement(new Integer(13));
Object result = client.execute("sample.sum", params);
int sum = ((Integer) result).intValue();
System.out.println("The sum is: " + sum);
} catch (Exception exception) {
System.err.println("JavaClient: " + exception);
}
}
}
让我们看看在上面的示例客户端中发生了什么。
-
Java 包 org.apache.xmlrpc 包含用于 XML-RPC Java 客户端和 XML-RPC 服务器的类,例如 XmlRpcClient。
-
包 java.util 是 Vector 类所必需的。
-
函数server.execute(...)将请求发送到服务器。在服务器上调用过程 sum(17,13),就好像它是一个本地过程一样。过程调用的返回值始终是 Object。
-
这里的“sample”表示在服务器中定义的处理程序。
-
请注意,过程调用的所有参数始终收集在 Vector 中。
-
XmlRpcClient 类是通过指定服务器机器的“Web 地址”和 /RPC2 来构造的。
-
localhost - 表示本地机器
-
您可以指定 IP 号码而不是 localhost,例如 194.80.215.219
-
您可以指定一个域名,例如 xyz.dyndns.org
-
您可以将端口号与域名一起指定为 xyz.dyndns.org:8080。默认端口为 80
-
-
请注意,远程过程调用的结果始终是一个对象,并且必须转换为适当的类型。
-
当出现问题(没有连接等)时,会抛出一个异常,并且必须使用catch语句来捕获它。
由于上述调用,客户端将以下消息发送到服务器。请注意,这是由server.execute(...)内部处理的,您与它无关。
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodCall>
<methodName>sample.sum</methodName>
<params>
<param>
<value><int>17</int></value>
</param>
<param>
<value><int>13</int></value>
</param>
</params>
</methodCall>
XML-RPC 服务器
以下是用 Java 编写的 XML-RPC Server 的源代码。它利用了 org.apache.xmlrpc 中可用的内置类。*
import helma.xmlrpc.WebServer;
public class JavaServer {
public Integer sum(int x, int y) {
return new Integer(x + y);
}
public static void main(String[] args) {
try {
System.out.println("Attempting to start XML-RPC Server...");
WebServer server = new WebServer(8080);
server.addHandler("sample", new JavaServer());
server.start();
System.out.println("Started successfully.");
System.out.println("Accepting requests. (Halt program to stop.)");
} catch (Exception exception) {
System.err.println("JavaServer: " + exception);
}
}
}
让我们看看我们在上面的示例服务器中做了什么。
-
包 org.apache.xmlrpc 包含用于 XML-RPC 服务器实现的类 WebServer。
-
远程调用的过程sum实现为类中的公共方法。
-
然后,同一服务器类的实例与客户端可访问的处理程序相关联。
-
服务器由端口号(这里:80)初始化。
-
当出现问题时,会抛出异常,并且必须使用catch语句来捕获。
对于给定示例客户端中提到的调用,服务器将以下响应发送回客户端:
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
<params>
<param>
<value><int>30</int></value>
</param>
</params>
</methodResponse>
现在您的服务器已准备就绪,因此请在提示符下编译并运行它,如下所示:
C:\ora\xmlrpc\java>java JavaServer
Attempting to start XML-RPC Server...
Started successfully.
Accepting requests. (Halt program to stop.)
现在要测试功能,请按如下方式调用此服务器:
C:\ora\xmlrpc\java>java JavaClient
30
XML-RPC - 总结
在本教程中,您了解了什么是 XML-RPC 以及我们为什么需要 XML-RPC。我们已经讨论了它的数据模型,以及客户端和服务器之间要交换的请求和响应消息格式。我们给出了一个示例来演示 XML-RPC 客户端和服务器如何工作以交换信息。
XML-RPC 是一个非常简单的概念,具有一组有限的功能。这些限制在许多方面都是 XML-RPC 最吸引人的特性,因为它们大大降低了实现协议和测试其互操作性的难度。
虽然 XML-RPC 很简单,但简单工具的创造性应用可以创建复杂而强大的架构。在多种不同系统需要通信的情况下,XML-RPC 可能是最合适的最低公分母。
下一步是什么?
下一步是学习 WSDL 和 SOAP。
WSDL
WSDL 是一种基于 XML 的语言,用于描述 Web 服务以及如何访问它们。
WSDL 描述了 Web 服务,以及 Web 服务的消息格式和协议详细信息。
如果您想了解有关 WSDL 的更多信息,请阅读我们的WSDL 教程。
肥皂
SOAP 是一个简单的基于 XML 的协议,它允许应用程序通过 HTTP 交换信息。
如果您想了解有关 SOAP 的更多信息,请阅读我们的SOAP 教程。
https://github.com/allwaysoft/Java-XML-RPChttps://github.com/allwaysoft/Java-XML-RPC