首页 »PHP教程 » php构造函数:在PHP中利用XML技术构造远程服务 »正文
php构造函数:在PHP中利用XML技术构造远程服务
来源: 发布时间:星期一, 2009年1月12日 浏览:32次 评论:0
未来 ![](/icons/41682de.gif) web将是以服务为中心 ![](/icons/41682de.gif) web ![](/icons/41682dou.gif) xml_rpc标准使得编写和应用服务变得非常简单 ![](/icons/41682dou2.gif) 本文介绍xml_rpc标准及其php实现 ![](/icons/41682dou.gif) 并通过例子示范了如何在php中开发xml_rpc服务和客户 ![](/icons/41682chengxu.gif) ![](/icons/41682yi.gif) 、服务式web 从内容提供商所采用 ![](/icons/41682de.gif) 简单思路方法到uddi(universal description ![](/icons/41682dou.gif) discovery and ![](/icons/41682int.gif) egration) ![](/icons/41682de.gif) 未来构想 ![](/icons/41682dou.gif) 业界已经有大量有关“服务式web” ![](/icons/41682de.gif) 介绍说明和评论 ![](/icons/41682dou2.gif) 就web ![](/icons/41682de.gif) 初创阶段来说 ![](/icons/41682dou.gif) 它只是 ![](/icons/41682yi.gif) 个文档 ![](/icons/41682de.gif) 集散地 ![](/icons/41682dou.gif) 提供 ![](/icons/41682de.gif) 只是 ![](/icons/41682yi.gif) 些可浏览 ![](/icons/41682de.gif) 信息 ![](/icons/41682dou2.gif) 随着web ![](/icons/41682de.gif) 发展 ![](/icons/41682dou.gif) 在web上运行服务越来越具有吸引力 ![](/icons/41682dou2.gif) 未来 ![](/icons/41682dou.gif) web将成为企业为客户和其他企业提供便捷服务 ![](/icons/41682de.gif) 载体 ![](/icons/41682dou2.gif) b2b和b2c模式间 ![](/icons/41682de.gif) 协同就可以看成是 ![](/icons/41682yi.gif) 种服务式web ![](/icons/41682yi.gif) 个很重要 ![](/icons/41682de.gif) 问题是 ![](/icons/41682dou.gif) web上究竟可以提供哪些服务?web能够提供 ![](/icons/41682de.gif) 服务非常多 ![](/icons/41682dou.gif) 其中有些服务现在已经在使用 ![](/icons/41682dou.gif) 有些服务在不久 ![](/icons/41682de.gif) 将来就会出现 ![](/icons/41682dou2.gif) 为了介绍说明问题 ![](/icons/41682dou.gif) 下面列出了 ![](/icons/41682yi.gif) 小部分可以通过web提供 ![](/icons/41682de.gif) 服务: ◆面向主题 ![](/icons/41682de.gif) 垂直搜索引擎 ![](/icons/41682dou2.gif) ◆供用户查找信息 ![](/icons/41682de.gif) 知识库 ![](/icons/41682dou2.gif) ◆用户可以请教问题 ![](/icons/41682de.gif) 专家系统 ![](/icons/41682dou2.gif) ◆银行服务 ![](/icons/41682dou2.gif) ◆新闻和信息出版服务 ![](/icons/41682dou2.gif) ◆数字化支付相关 ![](/icons/41682de.gif) 服务 ![](/icons/41682dou2.gif) ◆图形处理服务 ![](/icons/41682dou2.gif) ◆卫生和健康服务 那么 ![](/icons/41682dou.gif) 企业和组织通过web提供服务 ![](/icons/41682de.gif) 正确途径是什么呢?这是 ![](/icons/41682yi.gif) 个很重要 ![](/icons/41682de.gif) 问题 ![](/icons/41682dou2.gif) 今天 ![](/icons/41682dou.gif) 有些服务提供html界面 ![](/icons/41682dou.gif) 它们通过文档 ![](/icons/41682de.gif) 形式提供服务 ![](/icons/41682dou.gif) 但在服务界面 ![](/icons/41682de.gif) 背后隐藏着什么?在占领web ![](/icons/41682de.gif) 竞赛中 ![](/icons/41682dou.gif) web浏览器并不孤单 ![](/icons/41682dou.gif) 移动电话、手持设备以及微波炉的类 ![](/icons/41682de.gif) 设备都想要访问web、查询数据库、转换数据、提取信息 ![](/icons/41682dou.gif) 等等 ![](/icons/41682dou2.gif) 要实现真正 ![](/icons/41682de.gif) 服务式web ![](/icons/41682dou.gif) 在表现层(html)的下应该还有另外 ![](/icons/41682yi.gif) 层 2、xml_rpc标准 xml或许是近10年来最为重要 ![](/icons/41682de.gif) 标准 ![](/icons/41682dou.gif) xml词汇表(vocabulary)为企业构造服务环境提供了基石 ![](/icons/41682dou2.gif) 要构建服务式web就有必要学习xml_rpc标准 ![](/icons/41682dou.gif) 这不仅是 ![](/icons/41682yinwei.gif) xml_rpc对于把服务放到web上很有用 ![](/icons/41682dou.gif) 而且 ![](/icons/41682yinwei.gif) xml_rpc是 ![](/icons/41682yi.gif) 种已经成形 ![](/icons/41682de.gif) 、很容易采用 ![](/icons/41682de.gif) 标准 ![](/icons/41682dou2.gif) 对于b2b服务来说 ![](/icons/41682dou.gif) 提供服务 ![](/icons/41682de.gif) 标准是极其重要 ![](/icons/41682de.gif) ![](/icons/41682dou.gif) 共同遵循标准 ![](/icons/41682de.gif) 公司可以利用其它公司提供 ![](/icons/41682de.gif) 服务获得快速 ![](/icons/41682de.gif) 增长 ![](/icons/41682dou2.gif) 无法想象在各种私有 ![](/icons/41682de.gif) 服务标准的上可以建立起真正 ![](/icons/41682de.gif) 服务式web ![](/icons/41682dou.gif) 服务必须有 ![](/icons/41682yi.gif) 种可以遵循 ![](/icons/41682de.gif) 标准
xml_rpc是 ![](/icons/41682yi.gif) 种面向 ![](/icons/41682int.gif) ernet分布式处理 ![](/icons/41682de.gif) 标准 ![](/icons/41682dou2.gif) rpc即为remote procedure call(远程过程 ![](/icons/41682diaoyong.gif) ) ![](/icons/41682de.gif) 缩写 ![](/icons/41682dou.gif) 它是 ![](/icons/41682yi.gif) 种远程 ![](/icons/41682diaoyong.gif) 机制 ![](/icons/41682dou.gif) 用于 ![](/icons/41682diaoyong.gif) 可能驻留在其他机器的上以及可能用其他语言编写 ![](/icons/41682de.gif) 过程 ![](/icons/41682dou2.gif) 远程过程 ![](/icons/41682diaoyong.gif) 是分布式计算 ![](/icons/41682de.gif) 重要支柱 ![](/icons/41682dou2.gif) 例如 ![](/icons/41682dou.gif) 在 ![](/icons/41682yi.gif) 个分布式计算环境中 ![](/icons/41682dou.gif) 我们可以寻找和利用在其他机器上运行 ![](/icons/41682de.gif) 执行加法和减法操作 ![](/icons/41682de.gif) 过程 ![](/icons/41682dou.gif) 执行加法操作 ![](/icons/41682de.gif) 过程可能用apl编写、在rs6000机器上运行 ![](/icons/41682dou.gif) 执行减法操作 ![](/icons/41682de.gif) 过程可能用c编写、在unix上运行 ![](/icons/41682dou2.gif) 其他要使用这种分布式计算器 ![](/icons/41682de.gif) 开发者同样可以利用它们 ![](/icons/41682dou.gif) 或者他也可以选用另外更好 ![](/icons/41682de.gif) 计算器 在rpc中 ![](/icons/41682dou.gif) 过程(procedure)是最主要 ![](/icons/41682de.gif) 构件 ![](/icons/41682dou.gif) 服务器提供 ![](/icons/41682de.gif) 就是供客户端 ![](/icons/41682diaoyong.gif) ![](/icons/41682de.gif) 过程 ![](/icons/41682dou2.gif) 过程可以接收参数并返回结果 ![](/icons/41682dou2.gif) xml_rpc以http作为协议载体 ![](/icons/41682dou.gif) 通过发送和接收数据 ![](/icons/41682de.gif) xml词汇表实现rpc机制 ![](/icons/41682dou2.gif) xml_rpc服务器接收xml_rpc请求并返回xml_rpc应答 ![](/icons/41682dou.gif) xml_rpc客户 ![](/icons/41682chengxu.gif) 发送xml_rpc请求并接收xml_rpc应答 ![](/icons/41682dou2.gif) 服务器和客户必须按照xml_rpc标准 ![](/icons/41682de.gif) 要求处理应答和请求 3、xml_rpc协议 完整 ![](/icons/41682de.gif) xml_rpc规范标准可以在http://www.xmlrpc.com/spec找到 ![](/icons/41682dou2.gif) 下面是其要点介绍说明 xml_rpc请求 xml_rpc请求应该是http post请求 ![](/icons/41682dou.gif) 它 ![](/icons/41682de.gif) 正文是xml格式 ![](/icons/41682dou2.gif) 请求 ![](/icons/41682de.gif) xml部分格式如下: <?xml version="1.0" ?> <methodcall> <methodname>examples.getstatename</methodname> <params> <param> <value><i4>41</i4></value> </param> </params> </methodcall> 指定数据发送到哪里 ![](/icons/41682de.gif) url并未在这里指定 ![](/icons/41682dou2.gif) 如果服务器专门用来进行rpc处理 ![](/icons/41682dou.gif) 它可能是“/” ![](/icons/41682dou2.gif) 上述xml文档中 ![](/icons/41682de.gif) 有效载荷是 ![](/icons/41682yi.gif) 个“methodcall”结构 ![](/icons/41682dou2.gif) methodcall必须包含 ![](/icons/41682yi.gif) 个“methodname”子元素 ![](/icons/41682dou.gif) “methodname”子元素包含 ![](/icons/41682yi.gif) 个描述待 ![](/icons/41682diaoyong.gif) 思路方法 ![](/icons/41682de.gif) ![](/icons/41682zifu.gif) 串 ![](/icons/41682dou2.gif) 如何解释“methodname” ![](/icons/41682de.gif) 内容完全由服务器决定 ![](/icons/41682dou.gif) 例如它可以是 ![](/icons/41682yi.gif) 个执行文件 ![](/icons/41682de.gif) 名字 ![](/icons/41682dou.gif) 可以是数据库中记录 ![](/icons/41682de.gif) 名字 ![](/icons/41682dou.gif) 或者任何其他东西 ![](/icons/41682dou2.gif) 如果过程接收参数 ![](/icons/41682dou.gif) “methodcall”可以包含 ![](/icons/41682yi.gif) 个“params”元素以及若干个“param”子元素 ![](/icons/41682dou2.gif) 每 ![](/icons/41682yi.gif) 个“param”元素包含 ![](/icons/41682yi.gif) 个带有类型描述符 ![](/icons/41682de.gif) 值 ![](/icons/41682dou.gif) 类型描述符如下表所示:
标记介绍说明 <i4>或< ![](/icons/41682int.gif) > 4字节 ![](/icons/41682de.gif) 带符号整数 ![](/icons/41682dou.gif) 如12 <boolean> 0(false) ![](/icons/41682dou.gif) 或1(true) < ![](/icons/41682string.gif) > ![](/icons/41682zifu.gif) 串 ![](/icons/41682dou.gif) 如“hello world” <double> 双精度带符号浮点数 ![](/icons/41682dou.gif) 如-12.214 <datetime.iso8601> 日期/时间 ![](/icons/41682dou.gif) 如19980717t14:08:55 <base64> base64编码 ![](/icons/41682de.gif) 2进制数据 ![](/icons/41682dou.gif) 如ew91igbid0ihjlqgdghpcye 结构 值可以是 ![](/icons/41682yi.gif) 个结构 ![](/icons/41682dou.gif) 结构用元素描述 ![](/icons/41682dou2.gif) 每个包含多个 ![](/icons/41682dou.gif) 每个包含 ![](/icons/41682yi.gif) 个和 ![](/icons/41682yi.gif) 个 ![](/icons/41682dou2.gif) 下面是 ![](/icons/41682yi.gif) 个由两个元素构成 ![](/icons/41682de.gif) 结构: <struct> <member> <name>name</name> <value>< >member1</ ></value> </member> <member> <name>member2</name> <value><i4>19</i4></value> </member> </struct> 可以嵌套 ![](/icons/41682dou.gif) 任意可以包含或者任意其它类型 ![](/icons/41682dou.gif) 包括 值可以是 ![](/icons/41682shuzu.gif) 类型 ![](/icons/41682dou.gif) ![](/icons/41682shuzu.gif) 用元素描述 ![](/icons/41682dou2.gif) 每个元素包含 ![](/icons/41682yi.gif) 个元素 ![](/icons/41682dou.gif) 元素里面可以包含任意多个元素 ![](/icons/41682dou2.gif) 下面是 ![](/icons/41682shuzu.gif) 元素 ![](/icons/41682de.gif) ![](/icons/41682yi.gif) 个例子: < .gif' />> <data> <value><boolean>0</boolean></value> <value><i4>9</i4></value> <value>< >hello</ ></value> </data> </ .gif' />> 元素没有名字 ![](/icons/41682dou2.gif) 如前例所示 ![](/icons/41682dou.gif) 元素 ![](/icons/41682de.gif) 值可以是各种类型 ![](/icons/41682dou2.gif) 元素可以嵌套 ![](/icons/41682dou.gif) 任何都可以包含或者其他类型 ![](/icons/41682dou.gif) 如上面介绍 ![](/icons/41682de.gif) xml_rpc应答 xml_rpc应答是 ![](/icons/41682yi.gif) 个http应答 ![](/icons/41682dou.gif) 内容类型是text/xml ![](/icons/41682dou2.gif) 应答正文 ![](/icons/41682de.gif) 格式如下: <?xml version="1.0"?> <methodresponse> <params> <param> <value>< >abcdefg</ ></value> </param> </params> </methodresponse>
可能包含 ![](/icons/41682yi.gif) 个结构 ![](/icons/41682dou.gif) 或者可能包含 ![](/icons/41682yi.gif) 个结构 ![](/icons/41682dou.gif) 具体由过程 ![](/icons/41682diaoyong.gif) 是否成功决定 ![](/icons/41682dou2.gif) 结构和xml请求中 ![](/icons/41682de.gif) ![](/icons/41682yi.gif) 样 ![](/icons/41682dou.gif) 元素 ![](/icons/41682de.gif) 语法如下: <fault> <value> <struct> <member> <name>faultcode</name> <value>< >4</ ></value> </member> <member> <name>fault </name> <value>< >error!</ ></value> </member> </struct> </value> </fault> 4、基于xml_rpc ![](/icons/41682de.gif) web服务 利用xml_rpc构造和使用服务是很方便 ![](/icons/41682de.gif) ![](/icons/41682dou2.gif) 企业为自己提供 ![](/icons/41682de.gif) 各种服务部署xml_rpc服务器 ![](/icons/41682dou.gif) 用户、客户软件Software和客户企业就可以使用这种服务构造出高端服务或者面向最终用户 ![](/icons/41682de.gif) 应用 ![](/icons/41682dou2.gif) 这种提供更有效、廉价和优质服务 ![](/icons/41682de.gif) 竞争将极大地提高应用服务 ![](/icons/41682de.gif) 质量 但这里还存在 ![](/icons/41682yi.gif) 些问题有待解决 ![](/icons/41682dou.gif) 例如怎样编目、索引、搜索web上 ![](/icons/41682de.gif) 服务?uddi试图解决这个问题 ![](/icons/41682dou.gif) 不过这个标准并不简单 ![](/icons/41682dou.gif) 而且业界对它 ![](/icons/41682de.gif) 反应也尚未明了 ![](/icons/41682dou2.gif) 然而 ![](/icons/41682dou.gif) 在企业内部应用xml_rpc不仅能够改善代码 ![](/icons/41682de.gif) 可重用性 ![](/icons/41682dou.gif) 而且还会带来 ![](/icons/41682yi.gif) 种全新 ![](/icons/41682de.gif) 分布式计算模式 ![](/icons/41682dou.gif) 在此后 ![](/icons/41682de.gif) 数年中它必将成为 ![](/icons/41682yi.gif) 种重要 ![](/icons/41682de.gif) 知识财富 ![](/icons/41682dou2.gif) xml_rpc ![](/icons/41682de.gif) 发展从解决分布式计算问题以及成为服务式web ![](/icons/41682de.gif) 基本层面开始 ![](/icons/41682dou.gif) 从而获得了 ![](/icons/41682yi.gif) 个非常好 ![](/icons/41682de.gif) 开端 ![](/icons/41682dou.gif) 其后必将紧随着人们对该标准 ![](/icons/41682de.gif) 热衷 ![](/icons/41682dou2.gif) 既然如此 ![](/icons/41682dou.gif) 现在就让我们来看看xml_rpc ![](/icons/41682de.gif) 实际应用吧! 在php中应用xml_rpc 对于提供web服务来说 ![](/icons/41682dou.gif) php是 ![](/icons/41682yi.gif) 种非常理想 ![](/icons/41682de.gif) 语言 ![](/icons/41682dou2.gif) 我们只需编写好php代码然而把它放到 ![](/icons/41682yi.gif) 个合适 ![](/icons/41682de.gif) 位置 ![](/icons/41682dou.gif) 就立即有了 ![](/icons/41682yi.gif) 个可通过url“ ![](/icons/41682diaoyong.gif) ” ![](/icons/41682de.gif) 服务 ![](/icons/41682dou2.gif) php中 ![](/icons/41682de.gif) xml_rpc实现可能复杂也可能简单 ![](/icons/41682dou.gif) 但我们拥有许多种选择 ![](/icons/41682dou2.gif) 这里我们选用 ![](/icons/41682de.gif) 是来自useful information company ![](/icons/41682de.gif) xml_rpc实现 ![](/icons/41682dou.gif) 它 ![](/icons/41682de.gif) 代码和文档可以从http://xmlrpc.usefulinc.com/下载
这个xml_rpc实现 ![](/icons/41682de.gif) 基本类涉及两个文件: xmlrpc.inc:包含xml_rpc ![](/icons/41682de.gif) php客户端所需要 ![](/icons/41682de.gif) 类 xmlrpcs.inc:包含xml_rpc ![](/icons/41682de.gif) php服务器所需要 ![](/icons/41682de.gif) 类 客户端 ◆编写xml_rpc客户端意味着: ◆创建 ![](/icons/41682yi.gif) 个xml_rpc请求消息 ◆设置xml_rpc参数 ◆创建 ![](/icons/41682yi.gif) 个xml_rpc消息 ◆发送消息 ◆获得应答 ◆解释应答 请看下面这个例子: <?php $f= xmlrpcmsg(examples.getstatename, .gif' /> ( xmlrpcval(14, " "))); $c= xmlrpc_client("/rpc2", "betty.userland.com", 80); $r=$c->send($f); $v=$r->value ;
(!$r->faultcode ) { pr "状态代码". $http_post_vars["stateno"] . "是" . $v->scalarval . " "; pr "<hr>这是服务器 应答 <pre>" . htmlentities($r->serialize ). "</pre><hr>\n"; } { pr " : "; pr "代码: " . $r->faultcode . " 原因: " .$r->fault![](/icons/41682string.gif) ." "; } ?> 在这个例子中 ![](/icons/41682dou.gif) 我们先创建了 ![](/icons/41682yi.gif) 个 ![](/icons/41682diaoyong.gif) “examples.getstatename”思路方法 ![](/icons/41682de.gif) xml_rpc消息 ![](/icons/41682dou.gif) 并传递了 ![](/icons/41682yi.gif) 个类型为“ ![](/icons/41682int.gif) ”值为14 ![](/icons/41682de.gif) 整数参数 ![](/icons/41682dou2.gif) 然后 ![](/icons/41682dou.gif) 我们创建了 ![](/icons/41682yi.gif) 个描述待 ![](/icons/41682diaoyong.gif) url(路径、域和端口) ![](/icons/41682de.gif) 客户 ![](/icons/41682dou2.gif) 接着 ![](/icons/41682dou.gif) 我们发送了消息 ![](/icons/41682dou.gif) 接收应答对象并检查 ![](/icons/41682cuowu.gif) ![](/icons/41682dou2.gif) 如果不存在 ![](/icons/41682cuowu.gif) ![](/icons/41682dou.gif) 我们就显示结果 编写rpc客户程式时要用到 ![](/icons/41682de.gif) 主要 ![](/icons/41682hanshu.gif) 如下:
创建客户用: $client= xmlrpc_client($server_path, $server_hostname, $server_port); 发送消息 ![](/icons/41682de.gif) 思路方法是: $response=$client->send($xmlrpc_message); 他返回 ![](/icons/41682de.gif) 是xmlrpcresp ![](/icons/41682de.gif) ![](/icons/41682yi.gif) 个例子 ![](/icons/41682dou2.gif) 我们所传递 ![](/icons/41682de.gif) 消息是xmlrpcmsg ![](/icons/41682de.gif) 例子 ![](/icons/41682dou.gif) 他用如下思路方法创建: $msg= xmlrpcmsg($methodname, $parameter .gif' />); methodname是待 ![](/icons/41682diaoyong.gif) ![](/icons/41682de.gif) 思路方法(过程) ![](/icons/41682de.gif) 名字 ![](/icons/41682dou.gif) parameter ![](/icons/41682<img src=) .gif' />是xmlrpcval对象 ![](/icons/41682de.gif) php ![](/icons/41682shuzu.gif) ![](/icons/41682dou2.gif) 例如: $msg= xmlrpcmsg("examples.getstatename",
.gif' />( xmlrpcval(23, " "))); xmlrpcval对象能用如下形式创建: <?php $myval= xmlrpcval($ val); $myval= xmlrpcval($scalarval, " " | "boolean" | " " | "double" | "datetime.iso8601" | "base64"); $myval= xmlrpcval($ .gif' />val, " .gif' />" | "struct"); ?> 第 ![](/icons/41682yi.gif) 种形式创建 ![](/icons/41682de.gif) 是xmlrpc ![](/icons/41682zifu.gif) 串值 ![](/icons/41682dou2.gif) 第 2种形式创建 ![](/icons/41682de.gif) 是描述值和类型 ![](/icons/41682de.gif) 值 ![](/icons/41682dou2.gif) 第 3种形式通过在 ![](/icons/41682shuzu.gif) 的类 ![](/icons/41682de.gif) 结构中组合其他xmlrpc值创建复杂 ![](/icons/41682de.gif) 对象 ![](/icons/41682dou.gif) 例如: <?php $my .gif' />= xmlrpcval( .gif' />( xmlrpcval("tom"),
xmlrpcval("dick"), xmlrpcval("harry")), " .gif' />"); $mystruct= xmlrpcval( .gif' />( "name" => xmlrpcval("tom"), "age" => xmlrpcval(34, " "), "geek" => xmlrpcval(1, "boolean")),"struct"); ?>
应答对象是xmlrpcresp类型 ![](/icons/41682dou.gif) 通过 ![](/icons/41682diaoyong.gif) 客户对象 ![](/icons/41682de.gif) send思路方法获得 ![](/icons/41682dou2.gif) 在服务器端 ![](/icons/41682dou.gif) 我们能通过如下方式创建xmlrpcresp类型 ![](/icons/41682de.gif) 对象: $resp= xmlrpcresp($xmlrpcval); 而在客户端 ![](/icons/41682dou.gif) 则使用如下思路方法从应答获取xmlrpcval: $xmlrpcval=$resp->value ; 接下来我们就能用下面这种方式获取描述应答结果 ![](/icons/41682de.gif) php变量: $scalarval=$val->scalarval ; 对于复杂 ![](/icons/41682de.gif) 数据类型 ![](/icons/41682dou.gif) 有两个 ![](/icons/41682hanshu.gif) 非常有用 ![](/icons/41682dou.gif) 这两个 ![](/icons/41682hanshu.gif) 都在xmlrpc.inc内: $arr=xmlrpc_decode($xmlrpc_val); 该 ![](/icons/41682hanshu.gif) 返回 ![](/icons/41682yi.gif) 个php ![](/icons/41682shuzu.gif) ![](/icons/41682dou.gif) 其中包含了xmlrpcval变量$xmlrpc_val的内 ![](/icons/41682de.gif) 数据 ![](/icons/41682dou.gif) 这些数据已被转换成php本身具有 ![](/icons/41682de.gif) 变量类型 $xmlrpc_val=xmlrpc_encode($phpval); 该 ![](/icons/41682hanshu.gif) 返回 ![](/icons/41682yi.gif) 个xmlrpcval类型 ![](/icons/41682de.gif) 值 ![](/icons/41682dou.gif) 其中包含了$phpval描述 ![](/icons/41682de.gif) php数据 ![](/icons/41682dou2.gif) 对于 ![](/icons/41682shuzu.gif) 和结构 ![](/icons/41682dou.gif) 此思路方法能够进行递归分析 ![](/icons/41682dou2.gif) 注意 ![](/icons/41682dou.gif) 这里不存在对非基本数据类型(如base-64数据 ![](/icons/41682dou.gif) 或日期-时间数据) ![](/icons/41682de.gif) 支持 服务器端 利用xmlrpcs.inc提供 ![](/icons/41682de.gif) 类编写服务非常简单 ![](/icons/41682dou2.gif) 要创建 ![](/icons/41682yi.gif) 个服务 ![](/icons/41682dou.gif) 我们按照如下方式创建xmlrpc_server ![](/icons/41682de.gif) 例子: <?php $s= xmlrpc_server( .gif' />("examples.myfunc" =>
.gif' />("function" => "foo"))); ?> 传递给xmlrpc_server构造 ![](/icons/41682hanshu.gif) ![](/icons/41682de.gif) 是个联合 ![](/icons/41682shuzu.gif) ![](/icons/41682de.gif) 联合 ![](/icons/41682shuzu.gif) ![](/icons/41682dou2.gif) 过程“examples.myfunc” ![](/icons/41682diaoyong.gif) “foo” ![](/icons/41682hanshu.gif) ![](/icons/41682dou.gif) 由于这个原因foo被称为思路方法句柄 编写思路方法句柄非常简单 ![](/icons/41682dou2.gif) 下面是个思路方法句柄 ![](/icons/41682de.gif) 骨架: <?php function foo ($params) { global $xmlrpcerruser; // 引入用户 代码值 // $params是个xmlrpcval对象![](/icons/41682de.gif) ![](/icons/41682shuzu.gif)
($err) { // 条件
xmlrpcresp(0, $xmlrpcerruser+1, // 用户 1 "error!"); } { // 成功
xmlrpcresp( xmlrpcval("fine!", " ")); } } ?>
能看到 ![](/icons/41682dou.gif) 程式检查了 ![](/icons/41682cuowu.gif) ![](/icons/41682dou.gif) 如存在 ![](/icons/41682cuowu.gif) 则返回 ![](/icons/41682cuowu.gif) (从$xmlrpcerruser+1开始);否则如果 ![](/icons/41682yi.gif) 切正常 ![](/icons/41682dou.gif) 则返回描述操作成功信息 ![](/icons/41682de.gif) xmlrpcresp 5、应用例子 在下面这个例子中我们将构造 ![](/icons/41682yi.gif) 个服务 ![](/icons/41682dou2.gif) 对于给定 ![](/icons/41682de.gif) 数值n ![](/icons/41682dou.gif) 服务返回n*2 ![](/icons/41682dou2.gif) 客户端利用该服务计算5*2 ![](/icons/41682de.gif) 值 服务器端 ![](/icons/41682de.gif) 代码如下: <?php
("xmlrpc.inc");
("xmlrpcs.inc"); function foo ($params) { global $xmlrpcerruser; // 引入用户 代码值 // $params是xmlrpcval对象![](/icons/41682de.gif) 个![](/icons/41682shuzu.gif) $vala=$params->params[0]; $sval=$vala->scalarval ; $ret=$sval*2;
xmlrpcresp( xmlrpcval($ret, " ")); } $s= xmlrpc_server( .gif' />("product" =>
.gif' />("function" => "foo"))); ?> 客户端代码如下: <?php
("xmlrpc.inc");
($http_post_vars["number"]!="") { $f= xmlrpcmsg(product, .gif' />( xmlrpcval ($http_post_vars["number"], " "))); $c= xmlrpc_client("/xmlrpc/servfoo.php", "luigi.melpomenia.com.ar", 80); $c-> debug(0); $r=$c->send($f); $v=$r->value ;
(!$r->faultcode ) { pr "number ". $http_post_vars["number"] . " is " . $v->scalarval . " "; pr "<hr>来自服务器 结果! <pre>" . htmlentities($r->serialize ). "</pre><hr>\n"; } { pr "操作失败: "; pr "代码: " . $r->faultcode . " 原因: " .$r->fault![](/icons/41682string.gif) ." "; } } pr "<form method=\"post\"> <input name=\"number\" value=\"${number}\"> <input type=\"submit\" value=\"go\" name=\"submit\"></form><p> 输入 个数值"; ?> 结束语:xml_rpc服务 ![](/icons/41682de.gif) 运作还涉及其他许多基础设施和基础工作 ![](/icons/41682dou.gif) 如分布式过程 ![](/icons/41682de.gif) 编目和索引机制 ![](/icons/41682dou.gif) 又如在编程语言中处理xml_rpc ![](/icons/41682de.gif) 更好接口等 ![](/icons/41682dou2.gif) 有关xml_rpc和服务式web ![](/icons/41682de.gif) 报道非常多 ![](/icons/41682dou.gif) 让我们密切关注他们 ![](/icons/41682de.gif) 发展吧!
相关文章
读者评论
发表评论
|
|