`
isiqi
  • 浏览: 16003770 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

php5中XML-RPC函数的使用

阅读更多

这几天在看了zend php5 code contest的比赛获奖作品,看了几个的关于web架构方面的获奖作品,感受颇深,xml和php结合应用越来多了,里面几乎所有的作品在设计上都用到了xml这个东西.....-_-! 又落伍了不少. 建议朋友们都去看看. 所以自己这几天在疯狂的学习php和xml结合的相关知识.
这其中就遇到了XML-RPC服务, 在网上可以找到的资料不多, 而且大多数都是用了其他第三方用php开发的XML-RPC class, 而用php5自带的xmlrpc函数(目前是试验模块)的好像就不多了, 但是个人还是比较喜欢原生的东西,就自己研究了一下.

在手册中有人提供了一个例子,但是不支持中文, 并且没有告诉在客户端返回结果后怎么处理这个结果. 自己苦搞半天终于搞明白了,其实可以很轻松让他支持中文, 并且几乎不需要做任何额外的工作.

下面是他原来的例子(可以在手册中找到):
/* clienttest.php */
<?php
function do_call($host, $port, $request) {

$fp = fsockopen($host, $port, $errno, $errstr);
$query = "POST /servertest.php HTTP/1.0\nUser_Agent: My Egg Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";

if (!fputs($fp, $query, strlen($query))) {
$errstr = "Write error";
return 0;
}

$contents = '';
while (!feof($fp)) {
$contents .= fgets($fp);
}

fclose($fp);
return $contents;
}

$host = 'localhost';
$port = 80;
$request = xmlrpc_encode_request('cycle', 'egg');
$response = do_call($host, $port, $request);
/* do something with $response, e.g. print it */
?>

/* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */
switch($params[0]) {
case 'egg':
$reply = 'All eggs will be birds one day.';
break;
default:
$reply = 'That must have been an otheregg';
}
return $reply;
}

$server = xmlrpc_server_create();

/* register the 'external' name and then the 'internal' name */
xmlrpc_server_register_method($server, "cycle", "lifecycle");

$request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.

/* the parameters here are 'server, xml-string and user data'. There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print $response;

xmlrpc_server_destroy($server);
?>


这个例子中客户端得到$response后没有作任何的处理,这个返回值是这个样子的字符串:
HTTP/1.1 200 OK
Date: Thu, 04 Nov 2004 08:21:43 GMT
Server: Apache/2.0.47 (Win32) PHP/5.0.1
X-Powered-By: PHP/5.0.1
Connection: close
Content-Type: text/xml;charset=GB2312

<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<string>All eggs will be birds one day.</string>
</value>
</param>
</params>
</methodResponse>

这个字符串包含了两个部分,一个是html的头信息,一个是xml-rpc包文件,对他稍微进行一下处理就可以满足我们的要求了.

下面看看我修改过的例子,主要用了一个xmlrpc_decode函数,网上没有找到说明,自己试了半天,才试出来他的用法:
/* clienttest.php */
<?php
function do_call($host, $port, $request) {

$fp = fsockopen($host, $port, $errno, $errstr);
$query = "POST /servertest.php HTTP/1.0\nUser_Agent: My Egg Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";

if (!fputs($fp, $query, strlen($query))) {
$errstr = "Write error";
return 0;
}

$contents = '';
while (!feof($fp)) {
$contents .= fgets($fp);
}

fclose($fp);
return $contents;
}

$host = 'localhost';
$port = 80;
$request = xmlrpc_encode_request('cycle', 'egg');
$response = do_call($host, $port, $request);
/* do something with $response, e.g. print it */

$pos = strpos($response, '<?xml');
$str = substr($response, $pos);
$tmp = xmlrpc_decode($str);
print_r($tmp);

/* do something with $tmp e.g. print it */
?>

/* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */
switch($params[0]) {
case 'egg':
$reply[] = 'All eggs will be birds one day.我市好人';
$reply[] = 'All eggs will be birds one day.我市好人aaaaa';
break;
default:
$reply[] = 'That must have been an otheregg我市好人';
}
return $reply;
}

$server = xmlrpc_server_create();

/* register the 'external' name and then the 'internal' name */
xmlrpc_server_register_method($server, "cycle", "lifecycle");

$request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.

/* the parameters here are 'server, xml-string and user data'. There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print ($response);

xmlrpc_server_destroy($server);
?>

运行一下,看看显示的数组的样式,这样处理起来就舒服多了.

明白了这个,别闲着,看看php5自带的"SOAP Functions",使用方法和工作原理,大同小异啊.

分享到:
评论

相关推荐

    Aura XML-RPC Framework-开源

    Aura是PHP5中的即插即用XML-RPC应用程序框架。 它捆绑了一个XML-RPC客户端和一个XML-RPC服务器。 它具有简单干净的API,并允许将已编写的函数和类作为Web服务公开,以提高工作效率。

    PHP函数参考手册大全

    XML-RPC 函数 CLVIII. XMLReader functions CLIX. XSL functions CLX. XSLT Functions CLXI. YAZ Functions CLXII. YP/NIS Functions CLXIII. Zip File Functions (Read Only Access) CLXIV. Zlib Compression ...

    PHP5 完整官方 中文教程

    XML-RPC — XML-RPC 函数 XMLReader — XMLReader functions XMLWriter — XMLWriter Functions XSL — XSL functions XSLT — XSLT Functions YAZ — YAZ Functions YP/NIS — YP/NIS Functions Zip — Zip File ...

    PHP5中文参考手册

    XML-RPC — XML-RPC 函数 XMLReader — XMLReader functions XMLWriter — XMLWriter Functions XSL — XSL functions XSLT — XSLT Functions YAZ — YAZ Functions YP/NIS — YP/NIS Functions Zip — Zip File ...

    infusionsoft-php:用于Infusionsoft APIPHP客户端库

    如果使用Contacts , Orders或Products服务,则现在有两种不同的类处理每种服务-一种用于REST,一种用于XML-RPC。 默认情况下,此版本的SDK将加载REST类。 如果仍然需要XML-RPC类,则在请求对象时将'xml'作为参数...

    php帮助文档,php。chm,php必备的中文手册

    XML-RPC 函数 CLXIV. XMLReader functions CLXV. XSL functions CLXVI. XSLT Functions CLXVII. YAZ Functions CLXVIII. YP/NIS Functions CLXIX. Zip File Functions (Read Only Access) CLXX. Zlib Compression ...

    php手册.chm,php手册

    XML-RPC 函数 CLVIII. XMLReader functions CLIX. XSL functions CLX. XSLT Functions CLXI. YAZ Functions CLXII. YP/NIS Functions CLXIII. Zip File Functions (Read Only Access) CLXIV. Zlib Compression ...

    php中文完全开发手册

    XML-RPC 函数库 CXVIII. xdiff Functions CXIX. XSLT Functions CXX. YAZ Functions CXXI. YP/NIS Functions CXXII. Zip File Functions (Read Only Access) CXXIII. Zlib Compression Functions VI. Zend API 24. ...

    PHP5 开发手册 简体中文手册

    XML-RPC 函数 CLXIII. XMLReader functions CLXIV. XSL functions CLXV. XSLT Functions CLXVI. YAZ Functions CLXVII. YP/NIS Functions CLXVIII. Zip File Functions (Read Only Access) CLXIX. Zlib Compression...

    中文版PHP使用手册

    XML-RPC 函数 CLVIII. XMLReader functions CLIX. XSL functions CLX. XSLT Functions CLXI. YAZ Functions CLXII. YP/NIS Functions CLXIII. Zip File Functions (Read Only Access) CLXIV. Zlib Compression ...

    php手册PHP5研究室编无乱码版本chm

    XML-RPC 函数 CLVIII. XMLReader functions CLIX. XSL functions CLX. XSLT Functions CLXI. YAZ Functions CLXII. YP/NIS Functions CLXIII. Zip File Functions (Read Only Access) CLXIV. Zlib ...

    PHP手册(带评论版-2008-03-14).part2.rar

    XML-RPC 函数 CLVIII. XMLReader functions CLIX. XSL functions CLX. XSLT Functions CLXI. YAZ Functions CLXII. YP/NIS Functions CLXIII. Zip File Functions (Read Only Access) CLXIV. Zlib Compression ...

    PHP手册(带评论版-2008-03-14).part1.rar

    XML-RPC 函数 CLVIII. XMLReader functions CLIX. XSL functions CLX. XSLT Functions CLXI. YAZ Functions CLXII. YP/NIS Functions CLXIII. Zip File Functions (Read Only Access) CLXIV. Zlib Compression ...

    [PHP经典实例](中文版).作者:斯克拉&切贝特伯格.第二版.扫描版

    php中如何使用函数;php面向对象编程方面的能力;处理和验证表单输入、处理多页表单;介绍php内置的会话模块;详细介绍通过使用外部REST,SOAP或XML-RPC等服务消费Web服务的方方面面;详细介绍了文件系统;详细介绍...

    PHP手册2007整合中文版

    PHP,即“PHP: Hypertext Preprocessor”,是一种被广泛使用的开放源代码多用途脚本语言,尤其适用于 web 开发并可以嵌入到 HTML 中去。其语法利用了 C,Java 和 Perl,非常容易学习。该语言的主要目标是让 web 开发...

    PHP官方手册中文版

    XML-RPC 函数 CLXXXII. XMLReader functions CLXXXIII. XMLWriter Functions CLXXXIV. XSL functions CLXXXV. XSLT Functions CLXXXVI. YAZ Functions CLXXXVII. YP/NIS Functions CLXXXVIII. Zip File ...

    经典收藏最全php5.0查询手册

    XML-RPC 函数 CLVIII. XMLReader functions CLIX. XSL functions CLX. XSLT Functions CLXI. YAZ Functions CLXII. YP/NIS Functions CLXIII. Zip File Functions (Read Only Access) CLXIV. Zlib Compression ...

    php网络开发完全手册

    第5章 PHP中类的应用 70 5.1 PHP中OOP的应用 70 5.1.1 类简介 70 5.1.2 类的信息封装 71 5.1.3 静态类 71 5.2 创建一个简单类 71 5.3 PHP5与PHP4的差异 72 5.4 定义属性和方法 72 5.4.1 属性与方法的定义 72 5.4.2 ...

    O-Blog V2.6 Build 0430

    修正删除的时候ifDel()函数导致在IE5下不能完成跳转 修正在不支持short_open_tag的PHP环境中会报错的问题 修正后台文本框可以输入的字符数过少的问题 修正搜索的一个安全过滤问题 修正编辑日志时发表trackback会...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

     以直接用C/C++开始编写web服务及客户端程序而不需要了解SOAP协议的细节,但是由于我们在本节中使用了大量的实例来说明gSOAP与其他SOAP  实现的连接及通讯,所以了解一些SOAP及WSDL协议也是必需的。  5.1 如何...

Global site tag (gtag.js) - Google Analytics