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

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

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

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

来源: 发布时间:星期四, 2009年2月12日 浏览:100次 评论:0



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

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

4.1 在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服务器所需要

4.2 客户端
编写XML_RPC客户端意味着:

1.创建个XML_RPC请求消息

2.设置XML_RPC参数

3.创建个XML_RPC消息

4.发送消息

5.获得应答

6.解释应答

请看下面这个例子:

<?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->faultString.\"\'
\";
}
?>

在这个例子中我们先创建了“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, $parameterArray);
methodName是待思路方法(过程)名字parameterArray是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
$myArray= 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数据或者日期-时间数据)支持

4.3 服务器端
利用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->faultString.\"\'
\";
}
}
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

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: