PHP采用XML-RPC构造Web Service实例教程


Posted in PHP onJuly 16, 2014

一、概述:

目前进行Web Service通信有两种协议标准,一种是XML-RPC,另外一种是SOAP。XML-RPC比较简单,出现时间比较早,SOAP比较复杂,主要是一些需要稳定、健壮、安全并且复杂交互的时候使用。

PHP自身就集成了XML-RPC和SOAP两种协议的访问,都是集中在xmlrpc扩展当中。另外,在PHP的PEAR中,不管是PHP 4还是PHP 5,都已经默认集成了XML-RPC扩展,而且该扩展跟xmlrpc扩展无关,能够独立实现XML-RPC的协议交互,如果没有xmlrpc扩展,建议使用PEAR::XML-RPC扩展。

我们这里主要是以XML-RPC来简单描述Web Service的交互过程,部分内容来自PHP手册,更详细的内容,读者可以参考手册。

二、安装xmlrpc扩展:

如果你的系统中没有安装xmlrpc的php扩展,那么请正确安装。

在Windows平台下,首先把PHP安装目录下的扩展php_xmlrpc.dll放到C:\Windows或者C:\Winnt目录下,(PHP4的扩展在C:\php\extensions目录中,PHP5的扩展在C:\php\ext目录中。dll扩展文件的具体安装目录视你的php安装目录而定,此处仅为示例说明),同时在C:\Windows\php.ini或者C:\Winnt\php.ini中把extension=php_xmlrpc.dll前面的分号";"去掉,然后重启Web服务器后查看phpinfo()有没有XML-RPC项目就能够确定是否已经正确安装xmlrpc扩展。

在Unix/Linux平台下,如果没有安装xmlrpc扩展,请在重新编译PHP,在configure的时候请加入 --with-xmlrpc 选项,然后查看phpinfo()看是否正常安装xmlrpc。

(注意:以下操作都是建立在xmlrpc扩张正常安装前提下,请务必正确安装。)

三、XML-RPC工作原理:

XML-RPC大致就是整个过程就是使用XML来进行通信。首先构造一个RPC 服务器端用来出来从RPC客户端传递过来的使用XML封装的请求,并且把处理结果通过XML的形式返回给RPC客户端,客户端就去分析XML获取自己需要的数据。

XML-RPC的服务器端必须有现成的函数提供给客户端调用,并且客户端提交的请求中的函数和方法必须和服务器端的一致,否则将无法获取所需要的结果。

下面我进行简单的代码来描述整个过程。

四、XML-RPC实践:

服务器端使用xmlrpc_server_create函数产生一个服务器端,然后把需要需要暴露的RPC调用接口进行注册,接受RPC客户端POST过来的XML数据,然后进行处理,处理结果通过XML的形式显示给客户端。

rpc_server.php文件代码如下:

/**
* 函数:提供给RPC客户端调用的函数
* 参数:
* $method 客户端需要调用的函数
* $params 客户端需要调用的函数的参数数组
* 返回:返回指定调用结果
*/
function rpc_server_func($method, $params) {
$parameter = $params[0];
if ($parameter == "get")
{ 
$return = ''This data by get method''; 
}
else
{
$return = ''Not specify method or params'';
} 
return $return; 
} 
//产生一个XML-RPC的服务器端
$xmlrpc_server = xmlrpc_server_create(); 

//注册一个服务器端调用的方法rpc_server,实际指向的是rpc_server_func函数
xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func"); 

//接受客户端POST过来的XML数据
$request = $HTTP_RAW_POST_DATA;

//执行调用客户端的XML请求后获取执行结果
$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null); 


//把函数处理后的结果XML进行输出
header(''Content-Type: text/xml''); 
echo $xmlrpc_response; 

//销毁XML-RPC服务器端资源
xmlrpc_server_destroy($xmlrpc_server);

至此服务器端就构造好了,那么再构造我们的RPC客户端。客户端大致通过Socket访问XML-RPC服务器端的80端口,然后把需要调用的RPC接口封装到XML里,通过POST请求提交给RPC服务器端,最后获取服务器端返回结果。

rpc_client.php文件代码如下:

/**
* 函数:提供给客户端进行连接XML-RPC服务器端的函数
* 参数:
* $host 需要连接的主机
* $port 连接主机的端口
* $rpc_server XML-RPC服务器端文件
* $request 封装的XML请求信息
* 返回:连接成功成功返回由服务器端返回的XML信息,失败返回false
*/
function rpc_client_call($host, $port, $rpc_server, $request) { 

//打开指定的服务器端
$fp = fsockopen($host, $port); 

//构造需要进行通信的XML-RPC服务器端的查询POST请求信息
$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"; 

//把构造好的HTTP协议发送给服务器,失败返回false
if (!fputs($fp, $query, strlen($query))) 
{ 
$errstr = "Write error"; 
return false; 
} 

//获取从服务器端返回的所有信息,包括HTTP头和XML信息
$contents = ''''; 
while (!feof($fp))
{ 
$contents .= fgets($fp); 
} 

//关闭连接资源后返回获取的内容
fclose($fp); 
return $contents; 
} 

//构造连接RPC服务器端的信息
$host = ''localhost''; 
$port = 80; 
$rpc_server = ''/~heiyeluren/rpc_server.php'';

//把需要发送的XML请求进行编码成XML,需要调用的方法是rpc_server,参数是get
$request = xmlrpc_encode_request(''rpc_server'', ''get''); 

//调用rpc_client_call函数把所有请求发送给XML-RPC服务器端后获取信息
$response = rpc_client_call($host, $port, $rpc_server, $request); 

//分析从服务器端返回的XML,去掉HTTP头信息,并且把XML转为PHP能识别的字符串
$split = '''';
$xml = explode($split, $response);
$xml = $split . array_pop($xml);
$response = xmlrpc_decode($xml);

//输出从RPC服务器端获取的信息
print_r($response);

大致我们上面的例子就是提交一个叫做rpc_server的方法过去,参数是get,然后获取服务器端的返回,服务器端返回的XML数据是:

<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<string>This data by get method</string>
</value>
</param>
</params>
</methodResponse>

那么我们再通过xmlrpc_decode函数把这个XML编码为PHP的字符串,就能够随意处理了,至此整个Web Service交互完成。

五、总结:

不管是XML-RPC也好,SOAP也罢,只要能够让我们稳定、安全的进行远程过程的调用,完成我们的项目,那么就算整个Web Service就是成功的。另外,如果可以的话,也可以尝试使用PEAR中的XML-RPC来实现上面类似的操作,说不定会更简单,更适合你使用。有兴趣的读者可以尝试去完成。

PHP 相关文章推荐
PHP 页面跳转到另一个页面的多种方法方法总结
Jul 07 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 PHP
第4章 数据处理-php数组的处理-郑阿奇
Jul 04 PHP
PHP图片处理类 phpThumb参数用法介绍
Mar 11 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
Jun 12 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
twig里使用js变量的方法
Feb 05 PHP
PHP实现网站访问量计数器
Oct 27 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP调用全国天气预报数据接口查询天气示例
Feb 20 PHP
Laravel框架中缓存的使用方法分析
Sep 06 PHP
ThinkPHP应用模式扩展详解
Jul 16 #PHP
CodeIgniter模板引擎使用实例
Jul 15 #PHP
PHP以mysqli方式连接类完整代码实例
Jul 15 #PHP
destoon实现底部添加你是第几位访问者的方法
Jul 15 #PHP
destoon实现调用热门关键字的方法
Jul 15 #PHP
destoon实现资讯信息前面调用它所属分类的方法
Jul 15 #PHP
destoon实现首页显示供应、企业、资讯条数的方法
Jul 15 #PHP
You might like
PHP循环获取GET和POST值的代码
2008/04/09 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
PHP游戏编程25个脚本代码
2011/02/08 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
python中尾递归用法实例详解
2015/04/28 Python
Python 多进程和数据传递的理解
2017/10/09 Python
分享6个隐藏的python功能
2017/12/07 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
html5移动端自适应布局的实现
2020/04/15 HTML / CSS
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
英国工具中心:UK Tool Centre
2017/07/10 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
以下的初始化有什么区别
2013/12/16 面试题
金融专业应届生求职信
2013/11/02 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
教师三严三实心得体会
2014/10/11 职场文书
golang内置函数len的小技巧
2021/07/25 Golang
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android