专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » php构造函数:在PHP中利用XML技术构造远程服务 »正文

php构造函数:在PHP中利用XML技术构造远程服务

来源: 发布时间:星期一, 2009年1月12日 浏览:32次 评论:0
  未来web将是以服务为中心webxml_rpc标准使得编写和应用服务变得非常简单本文介绍xml_rpc标准及其php实现并通过例子示范了如何在php中开发xml_rpc服务和客户

  、服务式web

  从内容提供商所采用简单思路方法到uddi(universal descriptiondiscovery and egration)未来构想业界已经有大量有关“服务式web”介绍说明和评论就web初创阶段来说它只是个文档集散地提供只是些可浏览信息随着web发展在web上运行服务越来越具有吸引力未来web将成为企业为客户和其他企业提供便捷服务载体b2b和b2c模式间协同就可以看成是种服务式web

  个很重要问题是web上究竟可以提供哪些服务?web能够提供服务非常多其中有些服务现在已经在使用有些服务在不久将来就会出现为了介绍说明问题下面列出了小部分可以通过web提供服务:

  ◆面向主题垂直搜索引擎

  ◆供用户查找信息知识库

  ◆用户可以请教问题专家系统

  ◆银行服务

  ◆新闻和信息出版服务

  ◆数字化支付相关服务

  ◆图形处理服务

  ◆卫生和健康服务

  那么企业和组织通过web提供服务正确途径是什么呢?这是个很重要问题今天有些服务提供html界面它们通过文档形式提供服务但在服务界面背后隐藏着什么?在占领web竞赛中web浏览器并不孤单移动电话、手持设备以及微波炉的类设备都想要访问web、查询数据库、转换数据、提取信息等等要实现真正服务式web在表现层(html)的下应该还有另外

   2、xml_rpc标准

  xml或许是近10年来最为重要标准xml词汇表(vocabulary)为企业构造服务环境提供了基石要构建服务式web就有必要学习xml_rpc标准这不仅是xml_rpc对于把服务放到web上很有用而且xml_rpc是种已经成形、很容易采用标准对于b2b服务来说提供服务标准是极其重要共同遵循标准公司可以利用其它公司提供服务获得快速增长无法想象在各种私有服务标准的上可以建立起真正服务式web服务必须有种可以遵循标准

  xml_rpc是种面向ernet分布式处理标准rpc即为remote procedure call(远程过程)缩写它是种远程机制用于可能驻留在其他机器的上以及可能用其他语言编写过程远程过程是分布式计算重要支柱例如个分布式计算环境中我们可以寻找和利用在其他机器上运行执行加法和减法操作过程执行加法操作过程可能用apl编写、在rs6000机器上运行执行减法操作过程可能用c编写、在unix上运行其他要使用这种分布式计算器开发者同样可以利用它们或者他也可以选用另外更好计算器

  在rpc中过程(procedure)是最主要构件服务器提供就是供客户端过程过程可以接收参数并返回结果xml_rpc以http作为协议载体通过发送和接收数据xml词汇表实现rpc机制xml_rpc服务器接收xml_rpc请求并返回xml_rpc应答xml_rpc客户发送xml_rpc请求并接收xml_rpc应答服务器和客户必须按照xml_rpc标准要求处理应答和请求

   3、xml_rpc协议

  完整xml_rpc规范标准可以在http://www.xmlrpc.com/spec找到下面是其要点介绍说明

  xml_rpc请求

  xml_rpc请求应该是http post请求正文是xml格式请求xml部分格式如下:

<?xml version="1.0" ?>
<methodcall>
<methodname>examples.getstatename</methodname>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodcall>


  指定数据发送到哪里url并未在这里指定如果服务器专门用来进行rpc处理它可能是“/”上述xml文档中有效载荷是个“methodcall”结构methodcall必须包含个“methodname”子元素“methodname”子元素包含个描述待思路方法如何解释“methodname”内容完全由服务器决定例如它可以是个执行文件名字可以是数据库中记录名字或者任何其他东西如果过程接收参数“methodcall”可以包含个“params”元素以及若干个“param”子元素个“param”元素包含个带有类型描述符类型描述符如下表所示:

  标记介绍说明

  <i4>或<> 4字节带符号整数如12

  <boolean> 0(false)或1(true)

  <如“hello world”

  <double> 双精度带符号浮点数如-12.214

  <datetime.iso8601> 日期/时间如19980717t14:08:55

  <base64> base64编码 2进制数据如ew91igbid0ihjlqgdghpcye

  结构

  值可以是个结构结构用元素描述每个包含多个每个包含个和下面是个由两个元素构成结构:

<struct>
<member>
<name>name</name>
<value><>member1</></value>
</member>
<member>
<name>member2</name>
<value><i4>19</i4></value>
</member>
</struct>


  可以嵌套任意可以包含或者任意其它类型包括

  

  值可以是类型用元素描述每个元素包含个元素元素里面可以包含任意多个元素下面是元素个例子:

.gif' />>
<data>
<value><boolean>0</boolean></value>
<value><i4>9</i4></value>
<value><>hello</></value>
</data>
</.gif' />>


  元素没有名字如前例所示元素值可以是各种类型元素可以嵌套任何都可以包含或者其他类型如上面介绍

  xml_rpc应答

  xml_rpc应答是个http应答内容类型是text/xml应答正文格式如下:

<?xml version="1.0"?>
<methodresponse>
<params>
<param>
<value><>abcdefg</></value>
</param>
</params>
</methodresponse>


  可能包含个结构或者可能包含个结构具体由过程是否成功决定结构和xml请求中元素语法如下:

<fault>
<value>
<struct>
<member>
<name>faultcode</name>
<value><>4</></value>
</member>
<member>
<name>fault</name>
<value><>error!</></value>
</member>
</struct>
</value>
</fault>


   4、基于xml_rpcweb服务

  利用xml_rpc构造和使用服务是很方便企业为自己提供各种服务部署xml_rpc服务器用户、客户软件Software和客户企业就可以使用这种服务构造出高端服务或者面向最终用户应用这种提供更有效、廉价和优质服务竞争将极大地提高应用服务质量

  但这里还存在些问题有待解决例如怎样编目、索引、搜索web上服务?uddi试图解决这个问题不过这个标准并不简单而且业界对它反应也尚未明了然而在企业内部应用xml_rpc不仅能够改善代码可重用性而且还会带来种全新分布式计算模式在此后数年中它必将成为种重要知识财富xml_rpc发展从解决分布式计算问题以及成为服务式web基本层面开始从而获得了个非常好开端其后必将紧随着人们对该标准热衷既然如此现在就让我们来看看xml_rpc实际应用吧!

  在php中应用xml_rpc

  对于提供web服务来说php是种非常理想语言我们只需编写好php代码然而把它放到个合适位置就立即有了个可通过url“服务php中xml_rpc实现可能复杂也可能简单但我们拥有许多种选择这里我们选用是来自useful information companyxml_rpc实现代码和文档可以从http://xmlrpc.usefulinc.com/下载

  这个xml_rpc实现基本类涉及两个文件:

  xmlrpc.inc:包含xml_rpcphp客户端所需要

  xmlrpcs.inc:包含xml_rpcphp服务器所需要

  客户端

  ◆编写xml_rpc客户端意味着:

  ◆创建个xml_rpc请求消息

  ◆设置xml_rpc参数

  ◆创建个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."
";
}
?>


  在这个例子中我们先创建了“examples.getstatename”思路方法xml_rpc消息并传递了个类型为“”值为14整数参数然后我们创建了个描述待url(路径、域和端口)客户接着我们发送了消息接收应答对象并检查如果不存在我们就显示结果

  编写rpc客户程式时要用到主要如下:

  创建客户用:

$client= xmlrpc_client($server_path, $server_hostname, $server_port);

  发送消息思路方法是:

$response=$client->send($xmlrpc_message);

  他返回是xmlrpcresp个例子我们所传递消息是xmlrpcmsg例子他用如下思路方法创建:

$msg= xmlrpcmsg($methodname, $parameter.gif' />);

  methodname是待思路方法(过程)名字parameter.gif' />是xmlrpcval对象php例如:

$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");
?>


  第种形式创建是xmlrpc串值第 2种形式创建是描述值和类型第 3种形式通过在的类结构中组合其他xmlrpc值创建复杂对象例如:

<?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类型通过客户对象send思路方法获得在服务器端我们能通过如下方式创建xmlrpcresp类型对象:

$resp= xmlrpcresp($xmlrpcval);

  而在客户端则使用如下思路方法从应答获取xmlrpcval:

$xmlrpcval=$resp->value;

  接下来我们就能用下面这种方式获取描述应答结果php变量:

$scalarval=$val->scalarval;

  对于复杂数据类型有两个非常有用这两个都在xmlrpc.inc内:

$arr=xmlrpc_decode($xmlrpc_val);

  该返回个php其中包含了xmlrpcval变量$xmlrpc_val的内数据这些数据已被转换成php本身具有变量类型

$xmlrpc_val=xmlrpc_encode($phpval);

  该返回个xmlrpcval类型其中包含了$phpval描述php数据对于和结构此思路方法能够进行递归分析注意这里不存在对非基本数据类型(如base-64数据或日期-时间数据)支持

  服务器端

  利用xmlrpcs.inc提供类编写服务非常简单要创建个服务我们按照如下方式创建xmlrpc_server例子:

<?php
$s= xmlrpc_server( .gif' />("examples.myfunc" =>
.gif' />("function" => "foo")));
?>


  传递给xmlrpc_server构造是个联合联合过程“examples.myfunc”“foo”由于这个原因foo被称为思路方法句柄

  编写思路方法句柄非常简单下面是个思路方法句柄骨架:

<?php
function foo ($params) {
global $xmlrpcerruser; // 引入用户代码值
// $params是个xmlrpcval对象
($err) {
// 条件
xmlrpcresp(0, $xmlrpcerruser+1, // 用户1
"error!");
} {
// 成功
xmlrpcresp( xmlrpcval("fine!", ""));
}
}
?>


  能看到程式检查了如存在则返回(从$xmlrpcerruser+1开始);否则如果切正常则返回描述操作成功信息xmlrpcresp

   5、应用例子

  在下面这个例子中我们将构造个服务对于给定数值n服务返回n*2客户端利用该服务计算5*2

  服务器端代码如下:

<?php
("xmlrpc.inc");
("xmlrpcs.inc");
function foo ($params)
{
global $xmlrpcerruser; // 引入用户代码值
// $params是xmlrpcval对象
$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."
";
}
}
pr "<form method=\"post\">
<input name=\"number\" value=\"${number}\">
<input type=\"submit\" value=\"go\"
name=\"submit\"></form><p>
输入个数值";
?>




  结束语:xml_rpc服务运作还涉及其他许多基础设施和基础工作如分布式过程编目和索引机制又如在编程语言中处理xml_rpc更好接口等有关xml_rpc和服务式web报道非常多让我们密切关注他们发展吧!



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: