阿七
级别: 未验证会员
精华:
0
发帖: 909
威望: 0 点
金钱: 2161 RMB
贡献值: 0 点
在线时间:512(小时)
注册时间:2006-03-29
最后登录:2008-08-07
|
PHP中使用XML-RPC构造Web Service简单入门
作者:heiyeluren _G0_<WH6 * 时间:2006-03-05 {a6cA=WTPd * 博客:http://blog.csdn.net/heiyeshuwu O}w"@gO@. D6L5X/# E8LA+dKN: [ Web Service介绍 ] b;k3B7< IF~E
; Web Service就是为了异构系统的通信而产生的,它基本的思想就是使用基于XML的HTTP的远程调用提供一种标准的机制,而省去建立一种新协议的需求。目前进行Web Service通信有两种协议标准,一种是XML-RPC,另外一种是SOAP。XML-RPC比较简单,出现时间比较早,SOAP比较复杂,主要是一些需要稳定、健壮、安全并且复杂交互的时候使用。 vnr{Ekg HY!R | PHP中集成了XML-RPC和SOAP两种协议的访问,都是集中在xmlrpc扩展当中。另外,在PHP的PEAR中,不管是PHP 4还是PHP 5,都已经默认集成了XML-RPC扩展,而且该扩展跟xmlrpc扩展无关,能够独立实现XML-RPC的协议交互,如果没有xmlrpc扩展,建议使用PEAR::XML-RPC扩展。 cM 5V%w 68 \73L= 我们这里主要是以XML-RPC来简单描述Web Service的交互过程,部分内容来自PHP手册,更详细内容,建议参考手册。 qSA]61U& w 8BSY 2&o
jQhe [ 安装xmlrpc扩展 ] 0aM&+j\q} @^cR 如果你的系统中没有安装xmlrpc的php扩展,那么请正确安装。 6m$lK%P{1 |w].*c}Z 在Windows平台下,首先把PHP安装目录下的扩展php_xmlrpc.dll放到C:\Windows或者C:\Winnt目录下,(PHP4的扩展在C:\php\extensions目录中,PHP5的扩展在C:\php\ext目录中),同时在C:\Windows\php.ini或者C:\Winnt\php.ini中把extension=php_xmlrpc.dll前面的分号";"去掉,然后重启Web服务器后查看phpinfo()有没有XML-RPC项目就能够确定是否已经正确安装xmlrpc扩展。 {$xt
.< Em ;2fh 在Unix/Linux平台下,如果没有安装xmlrpc扩展,请在重新编译PHP,在configure的时候请加入 --with-xmlrpc 选项,然后查看phpinfo()看是否正常安装xmlrpc。 C116c" |5TzRz (注意:以下操作都是建立在xmlrpc扩张正常安装前提下,请务必正确安装。) 7z;X@+O}s i z
%wozf W7#dc89} [ XML-RPC工作原理 ] CC
B' (Cb;=:3G XML-RPC大致就是整个过程就是使用XML来进行通信。首先构造一个RPC 服务器端用来出来从RPC客户端传递过来的使用XML封装的请求,并且把处理结果通过XML的形式返回给RPC客户端,客户端就去分析XML获取自己需要的数据。 o]M1$)>b+ %zz,qs)Eu XML-RPC的服务器端必须有现成的函数提供给客户端调用,并且客户端提交的请求中的函数和方法必须和服务器端的一致,否则将无法获取所需要的结果。 %E2b{Y; 1I?`3N 下面我进行简单的代码来描述整个过程。 /b7]NC% `?G&w.Vs =}g-N)^ [ XML-RPC实践 ] ub;:"ns} J9-n3o 服务器端使用xmlrpc_server_create函数产生一个服务器端,然后把需要需要暴露的RPC调用接口进行注册,接受RPC客户端POST过来的XML数据,然后进行处理,处理结果通过XML的形式显示给客户端。 $p|Im, />n!2'! 代码如下: rpc_server.php ^r~O* GTM@
9^ <?php 2m^qXE$ /** ot0
g@q[3 * 函数:提供给RPC客户端调用的函数 K0~=9/ * 参数: ,_TE@]!$ * $method 客户端需要调用的函数 iG#92e4 * $params 客户端需要调用的函数的参数数组 2wu\.{6Zp * 返回:返回指定调用结果 5"y)<VLJX */ Dn)B19b function rpc_server_func($method, $params) { _6!
iv $parameter = $params[0]; $_3)m if ($parameter == "get") 7 0PGbAD { Cp+tcrd_s $return = 'This data by get method'; #"8'y } -24ccN; else %k<+#j6ZH { Apj[z2nr $return = 'Not specify method or params'; $&!|G-0' } kZhd^H. return $return; _DAqL@5n } 97 ,Y q3 Q~/=p>=uu //产生一个XML-RPC的服务器端 n1aOpz6` $xmlrpc_server = xmlrpc_server_create(); ~T/tk?:8Vi c
$lZ\r" //注册一个服务器端调用的方法rpc_server,实际指向的是rpc_server_func函数 *CbV/j"P? xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func"); _2)QL oIQ$
98 M //接受客户端POST过来的XML数据
3bJ|L3G $request = $HTTP_RAW_POST_DATA; F>5b[q6~4 m=Gb<)Y //执行调用客户端的XML请求后获取执行结果 a]Y9;( $xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null); m>3\1`ZF~<
@6%7X7m //把函数处理后的结果XML进行输出 ,b5vnW\ header('Content-Type: text/xml'); #_|O93HN' echo $xmlrpc_response; GctV
E
$&bl //销毁XML-RPC服务器端资源 -3y xmlrpc_server_destroy($xmlrpc_server); 0P{8s ?> NxDVU?@p* 3xKgj5M 服务器端构造好了,那么再构造我们的RPC客户端。客户端大致通过Socket访问XML-RPC服务器端的80端口,然后把需要调用的RPC接口封装到XML里,通过POST请求提交给RPC服务器端,最后获取服务器端返回结果。 86!$<!I ]0SqLe 代码如下:rpc_client.php yq<W+b/ R=$}uDFmW <?php Z
c#Jb /** fZLAZMrM * 函数:提供给客户端进行连接XML-RPC服务器端的函数 %o0 H#7' * 参数: *65~qAd * $host 需要连接的主机 -}( o+!nl * $port 连接主机的端口 ^#K^W V * $rpc_server XML-RPC服务器端文件 4x?I,cAN * $request 封装的XML请求信息 52,'8`
] * 返回:连接成功成功返回由服务器端返回的XML信息,失败返回false #XqiXM~^R */ 1jAuW~ function rpc_client_call($host, $port, $rpc_server, $request) { Fpwhyls }w2Et //打开指定的服务器端 Asq&Z$bB_ $fp = fsockopen($host, $port); \%%M >4c Ol>/^3a= //构造需要进行通信的XML-RPC服务器端的查询POST请求信息 C7}iwklcsa $query = "POST $rpc_server HTTP/1.0\nUser_Agent: XML-RPC Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n"; +^J;i
c \_
i22/Et //把构造好的HTTP协议发送给服务器,失败返回false i }Zz[b if (!fputs($fp, $query, strlen($query))) +&J1D8 { O'.{6H;
t $errstr = "Write error"; 9 }42s + return false; 5$X 8|Ve } 3O_O5 0m\( @2E //获取从服务器端返回的所有信息,包括HTTP头和XML信息 1|>bG#| $contents = ''; [
biz[
fm while (!feof($fp)) LcNI$g;}Yf { k)8*d{ * $contents .= fgets($fp); =KD[#au6a } A8AeM` i3Xo6!Q //关闭连接资源后返回获取的内容 -$@'@U fclose($fp); r?pFc3~N return $contents; r/0AM}[!*j } (hRg0Z= 9'|_1Q.b^ //构造连接RPC服务器端的信息 N
f}ZG $host = 'localhost'; gl2l%]=\' $port = 80; %/!f^PIwX $rpc_server = '/~heiyeluren/rpc_server.php'; Y
7?q` b'ir$RL] c //把需要发送的XML请求进行编码成XML,需要调用的方法是rpc_server,参数是get $H/:
-v $request = xmlrpc_encode_request('rpc_server', 'get'); n*#HokX e#WASHZN //调用rpc_client_call函数把所有请求发送给XML-RPC服务器端后获取信息 @f,/ K1k $response = rpc_client_call($host, $port, $rpc_server, $request); };gcM@]]E Ty3.u9c4 //分析从服务器端返回的XML,去掉HTTP头信息,并且把XML转为PHP能识别的字符串 &7{yk$]* $split = '<?xml version="1.0" encoding="iso-8859-1"?>'; p>+Q6o9O $xml = explode($split, $response); "od2i\ $xml = $split . array_pop($xml); DD[<J:
6 $response = xmlrpc_decode($xml); w
(*}, x}{O9LiR //输出从RPC服务器端获取的信息 {qs>yQ6a:- print_r($response); Su+[Q6oC@ C[><m2T ?> i
nk!>Z g?u=n`k]\ wb39s^n 大致我们上面的例子就是提交一个叫做rpc_server的方法过去,参数是get,然后获取服务器端的返回,服务器端返回的XML数据是: 3A.lS+P1 m.lzkS]P <?xml version="1.0" encoding="iso-8859-1"?> yMpZ-b$*~ <methodResponse> Lx|0G $ <params> y<l
(F?_ <param> U
[Lr+nKo\ <value> N_l_^yD <string>This data by get method</string> RP k'1nD </value> YhP+{Y8t </param> :*YnH&
</params> ;R$2+9 </methodResponse> {TDZDH WYIv&h<h" 那么我们再通过xmlrpc_decode函数把这个XML编码为PHP的字符串,我们就能够随意处理了,整个Web Service交互完成。 2AEVBkF;M Zh
`[A9I/ -&lD0p>*g [ 结束语 ] }hcY5E-n JoD@e[( 不管是XML-RPC也好,SOAP也罢,只要能够让我们稳定、安全的进行远程过程的调用,完成我们的项目,那么就算整个Web Service就是成功的。另外,如果可以的话,也可以尝试使用PEAR中的XML-RPC来实现上面类似的操作,说不定会更简单,更适合你使用。
?P/73p F^5\w-gLY 简单的使用XML-RPC进行Web Service交互就完成了,部分代码参考PHP手册,想获取详细信息建议参考手册,如果文章有不正确,请指正。 yR"mRy1 %AmyT yJ;Qe_up heiyeluren +,j6dYub write by 2006-3-5 下午 18:00
|
|
[楼 主]
|
Posted: 2006-04-04 14:29 |
| |