xmlRPC协议

来源:互联网 发布:为什么淘宝商品被下架 编辑:程序博客网 时间:2024/06/06 22:24

       xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。RPCRemote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为分布式计算,是为了提高各个分立机器的互操作性而发明出来的技术。

      按照“数据即程序”的观点来看,RPC无非是借助一些通信手段来互相传递数据(信息),所以她也是“高”层次的通信手段,无非是这种通信手段看起来更像是“过程的调用”,因为她往往以一个“函数”的面目示人,从而掩盖了她交换信息的实质。

  在各种RPC技术中,我想应该以Sun的RPC最为著名,比较流行的网络文件系统NFS就是建立在SUN RPC技术基础之上的。

  XMLRPC,顾名思义就是应用了XML技术的RPC。在Sun RPC中,调用双方传递的数据是二进制的,而在XMLRPC中数据将是XML格式的。那么为什么用XML而不用二进制呢?我想一方面应该是为了兼容更多的语言,因为这个世界上除了C/C++等编译语言,还有很多类似python,perl,javascript等的脚本语言(最近有些文章也称其为“动态语言”,因为他们通常不需要自己管理内存),另一方面是为了隔离操作系统的差异,比如说Little Endian和Big Endian的差异等。基于种种原因,XMLRPC选择了XML这种中间语言作为其信息的格式,然后由各个语言负责将其转变成各自native(本土)的数据类型。关于为了兼容各个语言所发明的中间语言还有IDL(Interface Definition Language:接口定义语言),它被用于CORBA接口的定义。

      xml rpc client和xml rpc server都有很多版本的实现。一般而言,一个实现版本都会同时实现client/server。但由于都满足xml rpc规范,从理论上讲,任何一个版本的rpc client实现与任何一个版本的rpc server都能配套使用。更进一步,由于xml rpc以xml文本的方式,使用http协议传输,所以与编程语言无关。例如:rpc client的已实现版本包括了:perl,php,python,c/c++,java,等等;rpc server的实现语言包括perl,java,等。

  同一种编程语言所实现的版本也不止一个。例如java版的实现有:Marque的xmlrpc实现,apache的xmlrpc 实现

完整的需要参考xmlrpc规范

  简单描述: rpcclient的工作原理:rpcclient根据URL找到rpcserver -> 构造命令包,调用rpcserver上的某个服务的某个方法 -> 接收到rpcserver的返回,解析响应包,拿出调用的返回结果。rpcserver的工作原理:启动一个webserver(在使用内置的webserver的情况下) -> 注册每个能提供的服务,每个服务对应一个Handler类 ->进入服务监听状态

      一个 XML-RPC消息就是一个请求体为 XML HTTP-POST请求。您需要一个 XML-RPC 客户程序来创建消息,以及一个 XML-RPC服务程序来接收消息。服务程序一旦完成了请求,就同样以 XML 格式送回一个 XML-RPC响应消息。请求可以包含参数(整数、字符串、日期以及其他类型,如果需要还可以包括数组和复杂记录)。每个请求的格式都极其简单,如清单 1所示

   

POST /RPC2 HTTP/1.0 User-Agent: Frontier/5.1.2 (WinNT) Host: betty.userland.com Content-Type: text/xml Content-length: 181 <?xml version="1.0"?> <methodCall>    <methodName>examples.getStateName</methodName>    <params>       <param><value><i4>41</i4></value></param>    </params> </methodCall>


  您需要一个指定“处理程序”名(清单 1中为 examples )的字符串 methodName和一个调用该处理程序的方法(清单 1 中为 getStateName)。无论如何,服务程序可以解释这个名字字串。我们所使用的 Java 服务程序(我们将稍候讨论)将用处理程序名 examples 找到一个对象,并且调用该对象之上的 getStateName方法。  其响应也很简单,如清单 2所示: 

HTTP/1.1 200 OK Connection: close Content-Length: 158 Content-Type: text/xml Date: Fri, 17 Jul 1998 19:55:08 GMT Server: UserLand Frontier/5.1.2-WinNT <?xml version="1.0"?> <methodResponse>    <params>       <param>          <value><string>South Dakota</string></value>       </param>    </params> </methodResponse>