Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18670485
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-05-27 22:04:28

本文节选于《Programming PHP》第二版(中译名《PHP程序设计》第二版,Haohappy等译,电子工业出版社出版)

11.7  Web Services

Web Services

从历史上看,当两个系统要通信 时,一个新的协议就会诞生(如SMTP用于发送邮件,POP3用于接收邮件,还有众多数据库客户端和服务器使用的协议)。Web Services的思想就是为基于XML和HTTP的远程过程调用提供一个标准的机制,这样可以避免创建各种新的协议。

Web Services使不同系统的集成变得容易。假如你需要为一个已存在的的图书馆系统写一个WEB接口,而这个系统相当复杂,有很多数据表和很多业务逻辑嵌 入在程序代码中来操作这些数据表。并且该系统是用C++写成的。当然你可以写很多PHP代码来重新实现这些业务逻辑,对数据表进行操作,或者你可以用C+ +写少量代码来让这个库的操作作为Web Services暴露给用户(如处理读者的还书、检查书是否到期,计算读者的过期罚金等)。这样PHP代码就只需要处理WEB前端,可以利用所有由图书馆 服务提供的各种高负荷的操作。

XML-RPC和SOAP是创建web services的两种标准协议。XML-RPC是出现较早的(也比较简单),而SOAP较新,也比较复杂。Microsoft的.NET就是基于 SOAP,而很多流行的WEB程序,如Frontier和blogger,则提供XML-RPC接口。

PHP通过xmlrpc扩展提供SOAP和XML-RPC的访问途径。xmlrpc基于xmlrpc-epi项目(更多信息请查看)。xmlrpc扩展默认是不可用的,你需要在编译PHP时加上--with-xmlrpc选项来启用该扩展。

提示:PEAR项目()正在编写一个面向对象的XML-RPC扩展,但在编写本书时还没完成。

11.7.1  服务器

Servers        

示例11-4展示了一个非常简单的XML-RPC服务器,它只提供了一个函数(XML-RPC称之为“方法”)。这个函数,即multiply( ),将两个数相乘并返回结果。这不是一个精彩的示例,但它展示了XML-RPC服务器的基本结构。

示例11-4:基本的XML-RPC服务器

//该函数暴露给客名端的名称为“multiply( )”

 function times ($method, $args) {

   return $args[0] * $args[1];

 }

 $request = $HTTP_RAW_POST_DATA;

 if (!$request) $request_xml = $HTTP_POST_VARS['xml'];

 $server = xmlrpc_server_create(  );

 if (!$server) die("Couldn't create server");

 xmlrpc_server_register_method($server, 'multiply', 'times');

$options = array('output_type' => 'xml', 'version' => 'auto');

 echo xmlrpc_server_call_method($server, $request, null, $options);

 xmlrpc_server_destroy($server);

?>

Xmlrpc扩展会处理方法调度,也就是说它会判断客户端希望调用的方法,然后对参数进行解码并调用相应的PHP函数,再对该函数返回的值用XML编码后发送到XML-RPC客户端,客户端将服务器发回的数据进行解码。

用xmlrpc_server_create( )创建一个服务器:

$server = xmlrpc_server_create(  );

通过XML-RPC的调试机制,我们可用xmlrpc_server_register_method( )来确定要暴露给客户端的函数及其方法名称:

xmlrpc_server_register_method(server, method, function);

其中method参数就是 XML-RPC客户端所获知的方法名称,function参数是实现该方法的PHP函数的名称。在示例 11-14中,multiply( )方法是由times()函数实现的。通常一个服务器会多次调用xmlrpc_server_register_method( )来暴露多个函数给客户端。

当你注册完所有方法,调用xmlrpc_server_call_method( )来进行调度:

$response = xmlrpc_server_call_method(server, request, user_data [, options]);

request参数是指XML -RPC请求,一般是作为HTTP POST数据发送到服务器端的。我们通过$HTTP_RAW_POST_DATA来获得它的值。请求包括要调用的方法及该方法的参数。参数被解码成PHP 数据类型,然后调用服务器端的函数(本示例中即times()函数)。

一个作为XML-RPC方法暴露的函数通常带有两个或3个参数:

$retval = exposed_function(method, args [, user_data]);

method参数包含XML-RPC方法的名称(这样你可以将一个PHP函数暴露为多个方法)。方法的参数由数组args传入,可选参数user_data包括xmlrpc_server_call_method( )的user_data参数所包括的所有数据。

xmlrpc_server_call_method( )的options参数是一个将选项名称映射到其值的数组。这些选项如下:

output_type

控制采用的数据编码方式,允许其值为“php”或“xml”(默认值)。

verbosity

控制在XML输出中加入多少空格符,以使其更具可读性。允许值为“no_white_space”,“newlines_only”和“pretty”(默认值)。

escaping

控制哪些字符被转义,如何转义。本选项允许将多个值以数组的形式给出。允许其值为"cdata"、 "non-ascii" (默认值)、 "non-print" (默认值)、 and "markup" (默认值)

versioning

控制使用哪个web service系统。允许其值为"simple"、"soap 1.1"、"xmlrpc" (客户端默认值)和"auto" (服务器端默认值,意思是“到达服务器端的请求可以是任何格式”)

encoding

控制数据的字符编码。允许其值为任何有效的编码方式的标识符,但是一般不需要进行改变。其默认编码方式为“iso-8859-1”。

11.7.2  客户端

Clients

XML-RPC客户端的主要工作是发出HTTP请求和解析服务器发回的响应。PHP所带的xmlrpc扩展可以将XML-RPC请求用XML编码,但它不知道如何发送HTTP请求。如果要具有这样的功能,可以从下载xmlrpc-epi程序包,然后安装其中的sample/utils/utils.php文件。该文件包含一个可以执行HTTP请求的函数。

示例11-15展示了XML-RPC乘法服务的一个客户端:

示例11-15:基本的XML-RPC客户端

 require_once('utils.php');

 $options = array('output_type' => 'xml', 'version' => 'xmlrpc');

 $result = xu_rpc_http_concise(

    array(method  => 'multiply',

          args     => array(5, 6),

          host     => '192.168.0.1',

          uri      => '/~gnat/test/ch11/xmlrpc-server.php',

          options => $options));

 echo "5 * 6 is $result";

?>

我们先载入一个方便好用的XML-RPC工具库(即utils.php),然后就可以使用xu_rpc_ http_concise( )函数,它可以为我们构造POST请求:

$response = xu_rpc_http_concise(hash);

hash参数是一个数组,它包含XML-RPC调用的各种属性值:

method

调用的方法名称

args

方法的参数数组

host

提供该方法的Web Service服务器主机名

url

Web Service的URL路径

options

服务器的选项关联数组

debug

如果这个参数的值不为0,则输出调试信息

xu_rpc_http_concise( )函数的返回值是服务器方法的返回值解码后的值。

还有一些XML-RPC特性本章未提及,如XML-RPC的数据类型并不总是与PHP的数据类型精确对应,但可以将这些值编 码成特殊的数据类型而不采用xmlrpc扩展通过最佳猜测选择的数据类型。当然,PHP的xmlrpc扩展的一些特性我们也没有介绍,如SOAP错误。想 知道全部细节,请查看,上面有xmlrpc扩展的详细文档。

关于XML-RPC的更多信息,请参阅Simon St.Laurent等人合著的《Programming  Web Services in XML-RPC》(O'Reilly出版);关于SOAP的更多信息,请参阅James Snell等人合著的《Programming Web Services with SOAP》(O'Reilly出版)。

阅读(473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~