📅  最后修改于: 2020-11-09 05:36:38             🧑  作者: Mango
RPC代表远程过程调用。顾名思义,它是一种调用远程计算机上可用的过程或函数的机制。 RPC是比Web更古老的技术。有效地,RPC为开发人员提供了一种机制,用于定义可以通过网络调用的接口。这些接口可以像单个函数调用一样简单,也可以像大型API一样复杂。
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使您可以快速轻松地建立通信。
即使您在单个环境中工作,您也可能会发现RPC方法使连接具有不同数据模型或处理期望的程序变得容易,并且可以轻松访问可重用的逻辑。
XML-RPC是用于在计算机之间建立各种连接的出色工具。
XML-RPC为集成商提供了使用标准词汇和方法交换信息的机会。
XML-RPC的最明显的应用领域是连接各种环境,从而使Java可以与Perl, Python,ASP等进行通信。
XML-RPC包含三个相对较小的部分:
XML-RPC数据模型:一组用于传递参数,返回值和错误(错误消息)的类型。
XML-RPC请求结构:包含方法和参数信息的HTTP POST请求。
XML-RPC响应结构:包含返回值或错误信息的HTTP响应。
在接下来的三章中,我们将研究所有这三个组成部分。
XML-RPC规范定义了六种基本数据类型和两种表示类型组合的复合数据类型。
Type | Value | Examples |
---|---|---|
int or i4 | 32-bit integers between – 2,147,483,648 and 2,147,483,647. |
|
double | 64-bit floating-point numbers |
|
Boolean | true (1) or false (0) |
|
string | ASCII text, though many implementations support Unicode |
|
dateTime.iso8601 | Dates in ISO8601 format: CCYYMMDDTHH:MM:SS |
20021125T02:20:04 20020104T17:27:30 |
base64 | Binary information encoded as Base 64, as defined in RFC 2045 |
|
这些基本类型始终包含在值元素中。字符串(只有字符串)可以包含在value元素中,但省略字符串元素。这些基本类型可以组合为两个更复杂的类型,数组和结构。数组表示顺序信息,而结构表示名称/值对,非常类似于哈希表,关联数组或属性。
数组由array元素指示,其中包含一个包含值列表的数据元素。与其他数据类型一样,数组元素必须包含在value元素中。例如,以下数组包含四个字符串:
This
is
an
array.
以下数组包含四个整数:
7
1247
-91
42
数组也可以包含不同类型的混合,如下所示:
1
Chaotic collection, eh?
-91
42.14159265
创建多维数组很简单-只需在数组内部添加一个数组即可:
10
20
30
15
25
35
一个简单的结构可能看起来像:
givenName
Joseph
familyName
DiNardo
age
27
这样,您可以实现任何编程语言支持的几乎所有数据类型。
XML-RPC请求是XML内容和HTTP标头的组合。 XML内容使用数据类型结构传递参数,并包含标识正在调用哪个过程的其他信息,而HTTP标头提供了用于通过Web传递请求的包装器。
每个请求都包含一个XML文档,其根元素是methodCall元素。每个methodCall元素都包含一个methodName元素和一个params元素。 methodName元素标识要调用的过程的名称,而params元素包含参数及其值的列表。每个params元素都包括一系列param元素,这些列表又包含value元素。
例如,要将请求传递给名为circleArea的方法,该方法采用Double参数(表示半径),XML-RPC请求将如下所示:
circleArea
2.41
这些请求的HTTP标头将反映发送方和内容。基本模板如下所示:
POST /target HTTP 1.0
User-Agent: Identifier
Host: host.making.request
Content-Type: text/xml
Content-Length: length of request in bytes
例如,如果可以从XML-RPC服务器中侦听/ xmlrpc来获得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
circleArea
2.41
这是一个普通的HTTP请求,带有精心构造的有效负载。
响应很像请求,但有一些额外的变化。如果响应是成功的-过程中发现,正确执行和返回的结果-然后将XML-RPC响应看起来很像一个请求,除了methodCall元素由methodResponse元素替换,没有方法名元素:
18.24668429131
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
18.24668429131
将响应从XML-RPC服务器传递到XML-RPC客户端后,将关闭连接。后续请求需要作为单独的XML-RPC连接发送。
XML-RPC故障是一种响应。如果在处理XML-RPC请求时出现问题,则methodResponse元素将包含fault元素而不是params元素。像params元素一样,fault元素只有一个值,该值指示出了问题。故障响应可能类似于:
No such method!
故障也将具有错误代码。 XML-RPC完全没有标准化错误代码。您需要查看特定软件包的文档,以了解它们如何处理错误。
故障响应也可能类似于:
code
26
message
No such method!
为了演示XML-RPC,我们将创建一个使用Java处理XML-RPC消息的服务器,并且将创建一个Java客户端来调用该服务器上的过程。
对话的Java端使用Apache XML Project的Apache XML-RPC,可从http://xml.apache.org/xmlrpc/获得。
将所有.jar文件放在适当的路径中,让我们使用JAVA创建一个客户端和一个小型XML-RPC服务器。
让我们写一个XML-RPC客户端呼叫被叫求和函数函数。此函数接受两个参数并返回它们的总和。
import java.util.*;
import org.apache.xmlrpc.*;
public class JavaClient
{
public static void main (String [] args)
{
try {
XmlRpcClient client = new XmlRpcClient("http://localhost/RPC2");
Vector params = new Vector();
params.addElement(new Integer(17));
params.addElement(new Integer(13));
Object result = server.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。
Vector类必须使用包java.util。
函数server.execute(…)将请求发送到服务器。过程sum(17,13)在服务器上被调用,就好像它是本地过程一样。过程调用的返回值始终是一个对象。
在此,“样本”表示在服务器中定义的处理程序。
请注意,过程调用的所有参数始终收集在Vector中。
通过指定服务器计算机的“ Web地址”后跟/ RPC2来构造XmlRpcClient类。
本地主机-表示本地计算机
您可以指定IP地址而不是localhost,例如194.80.215.219
您可以指定一个域名,例如xyz.dyndns.org
您可以将端口号和域名一起指定为xyz.dyndns.org:8080。默认端口是80
注意,远程过程调用的结果始终是一个对象,必须将其强制转换为适当的类型。
当出现问题(无连接等)时,将引发异常,并且必须使用catch语句捕获该异常。
由于上述调用,客户端将以下消息发送到服务器。请注意,这是由server.execute(…)在内部处理的,与它无关。
sample.sum
17
13
以下是用Java编写的XML-RPC Server的源代码。它利用了org.apache.xmlrpc。*中可用的内置类。
import org.apache.xmlrpc.*;
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(80);
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 Server实现的WebServer类。
远程调用的过程总和在类中作为公共方法实现。
然后,将同一服务器类的实例与客户端可访问的处理程序相关联。
服务器通过端口号(此处为80)初始化。
发生问题时,将引发Exception,并且必须使用catch语句来捕获。
对于给定示例客户端中提到的呼叫,服务器将以下响应发送回客户端:
30
现在您的服务器已准备就绪,因此请按照以下提示编译并运行它:
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可能是最合适的最低公分母。
下一步是学习WSDL和SOAP。
WSDL是一种基于XML的语言,用于描述Web服务以及如何访问它们。
WSDL描述了一个Web服务,以及该Web服务的消息格式和协议详细信息。
如果您想了解有关WSDL的更多信息,请阅读WSDL教程。
SOAP是一种简单的基于XML的协议,允许应用程序通过HTTP交换信息。
如果您想了解有关SOAP的更多信息,请阅读我们的SOAP教程。