📜  XML-RPC-快速指南

📅  最后修改于: 2020-11-09 05:36:38             🧑  作者: Mango


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中的基本数据类型

Type Value Examples
int or i4 32-bit integers between – 2,147,483,648 and 2,147,483,647.

27

27

double 64-bit floating-point numbers

27.31415

-1.1465

Boolean true (1) or false (0)

1

0

string ASCII text, though many implementations support Unicode

Hello

bonkers! @

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

SGVsbG8sIFdvcmxkIQ==

这些基本类型始终包含在元素中。字符串(只有字符串)可以包含在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-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-响应格式

响应很像请求,但有一些额外的变化。如果响应是成功的-过程中发现,正确执行和返回的结果-然后将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故障是一种响应。如果在处理XML-RPC请求时出现问题,则methodResponse元素将包含fault元素而不是params元素。像params元素一样,fault元素只有一个值,该值指示出了问题。故障响应可能类似于:



   
      No such method!
   

故障也将具有错误代码。 XML-RPC完全没有标准化错误代码。您需要查看特定软件包的文档,以了解它们如何处理错误。

故障响应也可能类似于:



   
      
         
            
               code
               26
            
                
            
               message
               No such method!
            
                
         
      
   

XML-RPC-示例

为了演示XML-RPC,我们将创建一个使用Java处理XML-RPC消息的服务器,并且将创建一个Java客户端来调用该服务器上的过程。

对话的Java端使用Apache XML Project的Apache XML-RPC,可从http://xml.apache.org/xmlrpc/获得。

将所有.jar文件放在适当的路径中,让我们使用JAVA创建一个客户端和一个小型XML-RPC服务器。

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
      
   

XML-RPC服务器

以下是用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很简单,但是简单工具的创造性应用程序可以创建复杂而强大的体系结构。在需要进行各种不同系统通信的情况下,XML-RPC可能是最合适的最低公分母。

下一步是什么?

下一步是学习WSDL和SOAP。

WSDL

WSDL是一种基于XML的语言,用于描述Web服务以及如何访问它们。

WSDL描述了一个Web服务,以及该Web服务的消息格式和协议详细信息。

如果您想了解有关WSDL的更多信息,请阅读WSDL教程

肥皂

SOAP是一种简单的基于XML的协议,允许应用程序通过HTTP交换信息。

如果您想了解有关SOAP的更多信息,请阅读我们的SOAP教程