Ros

XML-RPC(1/2):概述

Ros用XML-RPC实现进程间通信。本文说下什么是XML-RPC,以及XML-RPC中的数据类型。想了解更多XM_RPC细节参考网上其它文章,像“XML-RPC远程方法调用”。

一、XML-RPC

XML-RPC的全称是XML Remote Procedure Call,即XML远程过程调用。

它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。 这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。XML-RPC尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。

XML-RPC是使用HTTP协议做为传输协议的RPC(远程过程调用)机制,使用XML文本的方式传输命令和数据,即HTTP协议中的BODY部分是XML文本。

一个RPC系统,必然包括2个部分:

  • RPC Client。用来向RPC Server调用方法,并接收方法的返回数据。
  • RPC Server。用于响应RPC Client的请求,执行方法,并回送方法执行结果。

RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。

1.1 XML-RPC的可用版本

XML-RPC client和XML-RPC server都有很多版本的实现。一般而言,一个实现版本都会同时实现client/server。但由于都满足xml rpc规范,从理论上讲,任何一个版本的XML-RPC client实现与任何一个版本的XML-RPC server都能配套使用。

更进一步,由于XML-RPC以XML文本的方式,使用http协议传输,所以与编程语言无关。例如:XML-RPC client的已实现版本包括了:perl、php、python、c/c++、java,等等。XML-RPC server的实现语言包括perl、java,等。

Ros使用的XML-RPC是C/C++,具体是开源项目xmlrpcpp

二、XML-RPC的数据类型

6种基本数据类型,2种组合数据类型。总之一切皆value。所以一共有八种value。以下加粗文字是要封装的数据。

  • <value><int>2323</int></value>
  • <value><double>23.23<double></value>
  • <value><boolean>1或者0</boolean></value>
  • <value><string>weidiao</string></value>
  • <value><dateTime>20021125T02:20:04</dateTime></value>格式显而易见:yyyyMMddThh:mm:ss
  • <value><base64>ASDFASD9823</base64></value>将任意二进制数据转换成base64编码方式。
  • <value><array><data>里面可以放多个value</data></array></value>我认为data这个标签有点多余
  • <value><struct>这里可以放多个member,每一个member都是一个name-value-pair</struct></value>

2.1 6种基本数据类型

TypeValueExamples

int or i4

32-bit integers between - 2,147,483,648 and 2,147,483,647.

<int>27</int>; <i4>27</i4>

double64-bit floating-point numbers

<double>27.31415</double>; <double>-1.1465</double>

booleantrue (1) or false (0)

<boolean>1</boolean>; <boolean>0</boolean>

stringASCII text, though many implementations support Unicode

<string>Hello</string>; <string>bonkers! @</string>

dateTime.iso8601Dates in ISO8601 format: CCYYMMDDTHH:MM:SS

<dateTime>20021125T02:20:04</dateTime>

<dateTime>20020104T17:27:30</dateTime>

base64Binary information encoded as Base 64, as defined in RFC 2045<base64>SGVsbG8sIFdvcmxkIQ==</base64>

表中是基本数据类型,它们在xml中表示如下:<value><type>xxxx</type></value>。除了string类型可以省略<type>标签外,其余五种基本数据类型必须明确注明数据类型,但强烈建议不要使用这个例外,做统一处理,即所有数据类型必须注明数据类型(type)。

两种组合数据类型:数组和结构体。数组表示了一种序列化信息,数组可以包含多种数据类型;结构体其实相当于映射,是键值对,是属性集,是关联数组。

2.2 数组

数组中的元素类型可以有多种,数组也可以嵌套的。以下是数组示例。

<value>
   <array>
      <data>
        
         <value>
            <array>
               <data>
                  <value><string>张三</string></value>
                  <value><int>20</int></value>
                  <value><int>30</int></value>
               </data>
            </array>
         </value>
            
         <value>
            <array>
               <data>
                  <value><string>李四</string></value>
                  <value><int>25</int></value>
                  <value><int>35</int></value>
               </data>
            </array>
         </value>
            
      </data>
   </array>
</value>

2.3 结构

struct内可以放多个member,每一个member都是一个name-value-pair

<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>

三、HTTP请求、回复

3.1 发出请求

请求的格式是http请求头部+xml的具体数据内容,通过post方式发送到服务器。

其中xml内容包括两大部分:方法名及参数,一旦进入<param></param>标签,就跟上面那些数据类型一样一样的了。

<?xml version="1.0"?>
<methodCall>
   <methodName>circleArea</methodName>
      <params>
         <param>
            <value><double>2.41</double></value>
         </param>
      </params>
</methodCall>

3.2 收到的回复

包括两部分:http头部+xml具体内容,跟发送时没多大区别。如你所见,既然有http头部,那就完全可以保存cookie。

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>

以下是正确处理时的回复,如果处理失败,Server把错误信息反馈给Client。

<?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>

全部评论: 0

    写评论: