Drupal 可与外部系统进行良好的集成。也就是说,如果存在一个开放的标准,drupal可以通过核心模块或者第3方模块这两种方式来支持这一标准。XML-RPC也不例外:Drupal内置了对它的支持。在本章中,你将学习到如何在drupal中,发送和接受XML-RPC调用。
译者:老葛, Think in Drupal
一个远程过程调用(remote procedure call)是指一个程序要求另一个程序执行一个函数。XML-RPC就是远程过程调用的标准,它采用XML格式编码并使用HTTP传送。XML-RPC协议是由UserLand软件公司的Dave Winner与微软合作创造出来的。它是专门用于分布式网络系统之间的相互对话的,比如当一个Drupal网站需要另一个Drupal网站的一些信息时,就可以使用XML-RPC。
当一个XML-RPC发生时,存在着两个参与者。一个是产生请求的网站,作为客户端。另一个是接受请求的,作为服务器端。
译者:老葛, Think in Drupal
如果你的网站仅仅用作服务器, 这就没有任何担心了,因为传入的XML-RPC请求使用标准的web端口(通常为端口80).在你的Drupal安装目录中的文件xmlrpc.php里面,包含了处理XML-RPC请求的代码。它也被称为XML-RPC终端。
注意:部分用户可能会悄悄的对文件xmlrpc.php进行重命名,来修改他们的终端,从而增加安全性。这会阻止恶意的网络爬虫,探测到服务器的XML-RPC接口。如果你的网站不接受XML-RPC请求的话,那么完全可以将其删除。
为了让你的Drupal网站能够作为客户端,那么它就必须具有向外发送HTTP请求的能力。一些主机服务提供商出于安全原因禁止了这一能力,这样你的drupal网站发送的HTTP就穿过不了他们的防火墙。
老葛的Drupal培训班 Think in Drupal
在网站http://www.xmlrpc.com上可以看到XML-RPC说明,它同时也带有了一些可用于测试的例子。在我们的第一个例子中,让我们通过XML-RPC来向该站点请求当前时间:
老葛的Drupal培训班 Think in Drupal
让我们尝试一个稍微复杂的例子。它仅仅复杂了一点点,因为你不但发送了你所调用的远程方法的名称,而且还包括了一个参数。UserLand软件在站点betty.userland.com运行了一个web服务:它将50个美国的州以字母顺序排列。所以如果你请求第1个州,它返回Alabama。第50个州为Wyoming。方法的名称为examples.getStateName。让我们向它请求列表中的第3个州:
当与远程的服务器打交道时,经常会出错.例如,你可能会遇到语法错误;服务器可能会挂掉;或者网络连接不通.让我们看看Drupal是如何处理这些情况的.
老葛的Drupal培训班 Think in Drupal
老葛的Drupal培训班 Think in Drupal
前面的代码也适用与HTTP错误,比如当服务器不存在,但是该路径上的web服务不存在时.现在,我们向drupal.org请求该服务, drupal.org指出 http://drupal.org/RPC2不存在:
如果你成功的连接到了服务器,尝试从betty.userland.com获取州名,但是却忘记提供州号了,而这个又是必须的参数:
老葛的Drupal培训班 Think in Drupal
正如在XML-RPC客户端例子中所看到的,Drupal为你做了大部分工作。现在让我们看一个简单的服务器端的例子。你需要做3件事来建立你的服务器:
xmlrpc钩子描述了由模块所提供的外部XML-RPC方法。在我们的例子中,我们仅提供了一个方法。,所以这里,方法名字为:remoteHello.hello。这是请求者使用的名字,它是任意的。一个好的实践是使用“.“分割的字符串,使用你的模块名作为前半部分,使用一个描述性的动词作为后半部分。
xmlrpc钩子有两种形式。简单的形式,如例子remotehello.module中所展示的,它简单的将一个外部的方法名映射到一个函数上。在一个更高级的形式中,它描述了方法的方法签名;这里指的是,它返回的是什么XML-RPC类型,以及每一个参数的类型(参看http://www.xmlrpc.com/spec来查看类型列表).下面是remotehello.module的升级版,xmlrpc钩子的形式更复杂一些:
Drupal自带了多个XML-RPC方法.在下面的部分中,将讲解这些内置方法.
老葛的Drupal培训班 Think in Drupal
system.methodSignature
当读完这一章后,你应该可以: