在PHP中利用XML技术构造远程服务_php基础_脚本之家

四、基于XML_RPC的Web服务
利用XML_RPC结构和选拔劳务是很方便的。集团为团结提供的各个劳动配置XML_RPC服务器,客商、客户软件和客商公司就能够运用这种劳动布局出高档服务依旧面向最后客户的运用。这种提供更使得、廉价和优异服务的竞争将一点都不小地升高应用服务的材质。
但这里还存在部分主题材料有待消亡,举个例子如何编目、索引、寻找Web上的劳务?UDDI试图缓和这一个主题材料,可是这些正式并不轻便,而且产业界对它的影响也尚无明了。但是,在百货店中间使用XML_RPC不只好够更正代码的可重用性,并且还有恐怕会带给一种全新的布满式计算形式,在事后的数年中它必然成为一种首要的学问能源。XML_RPC的前行从解决遍布式计算难题以致成为服务式Web的骨干范畴开头,进而赢得了一个相当好的始发,其后必定将紧随着大家对该专门的学问的爱怜。既然如此,今后就让大家来看看XML_RPC的其实使用吧!
4.1 在PHP中采用XML_RPC
对于提供Web服务以来,PHP是一种特别精美的语言。大家只需编写好PHP代码但是把它内置一个卓殊的岗位,就立时有了三个可透过U君越L“调用”的劳动。PHP中的XML_RPC完结或然复杂也说不许轻便,但大家具备多数样选用。这里大家选择的是来源于Useful
Information
Company的XML_RPC达成,它的代码和文书档案能够从
这个XML_RPC完结的基本类涉及八个文本:
xmlrpc.inc:包括XML_RPC的php客商端所急需的类
xmlrpcs.inc:包括XML_RPC的php服务器所急需的类 4.2 客商端
编写XML_RPC客商端意味着: 1.成立二个XML_RPC伏乞音信 2.安夸口ML_RPC参数
3.开立二个XML_RPC音信 4.发送音讯 5.获得应答 6.批注应答
请看下面这几个事例: <?php $f=new
xmlrpcmsg(‘examples.getStateName’,array(new xmlrpcval卡塔尔国; $c=new
xmlrpc_client(“/RPC2”, “betty.userland.com”, 80卡塔尔国; $r=$c->send; if {
print “状态代码”. $HTTP_POST_VARS[“stateno”] . “是” .
$v->scalarval(卡塔尔 . “<B宝马7系>”; print
“<HWrangler>那是服务器的作答<B奥迪TTS><PRE>” . htmlentities. “</PRE><H讴歌RDX>n”;
} else { print “错误: “; print “代码: ” . $r->faultCode(State of Qatar . ” 原因:
‘” .$r->faultString(卡塔尔.”‘<B揽胜极光>”; } ?>
在此个例子中,大家先创建了多少个调用“examples.getStateName”方法的XML_RPC音信,并传递了一个项目为“int”值为14的整数参数。然后,我们成立了二个呈报待调用U锐界L的客商。接着,大家发送了音讯,选拔应答对象并检讨错误。若是不设有指皁为白,大家就显示结果。
编写RPC客商程序时要用到的基本点函数如下: 制造客商用: $client=new
xmlrpc_client($server_path, $server_hostname, $server_portState of Qatar;
发送音讯的点子是: $response=$client->send;
它回到的是xmlrpcresp的一个实例。我们所传递的音讯是xmlrpcmsg的实例,它用如下方法创制:
$msg=new xmlrpcmsg($methodName, $parameterArray卡塔尔(قطر‎;
methodName是待调用的措施的名字,parameterArray是xmlrpcval对象的php数组。例如:
$msg=new xmlrpcmsg(“examples.getStateName”, array(new xmlrpcval卡塔尔;
xmlrpcval对象能够用如下格局创立: <?php $myVal=new xmlrpcval;
$myVal=new xmlrpcval($scalarVal, “int” | “boolean” | “string” | “double”
| “dateTime.iso8601” | “base64″卡塔尔; $myVal=new xmlrpcval($arrayVal,
“array” | “struct”State of Qatar; ?>
第一种格局创制的是xmlrpc字符串值。第两种方式成立的是描述值和花色的值。第三种样式通过在数组等等的布局中结成其余xmlrpc值创设复杂的靶子,举个例子:
<?php $myArray=new xmlrpcval(array(new xmlrpcval, new xmlrpcval,new
xmlrpcval, “array”卡塔尔(قطر‎; $myStruct=new xmlrpcval(array( “name” => new
xmlrpcval, “age” => new xmlrpcval, “geek” => new xmlrpcval(1,
“boolean”卡塔尔国卡塔尔(قطر‎,”struct”卡塔尔(قطر‎; ?>
应答对象是xmlrpcresp类型,通过调用顾客对象的send方法得到。在劳务器端,大家能够通过如下格局创制xmlrpcresp类型的对象:
$resp=new xmlrpcresp; 而在客商端,则应用如下方法从回答获取xmlrpcval:
$xmlrpcVal=$resp->value(卡塔尔;
接下来大家即可用下边这种艺术赢得描述应答结果的PHP变量:
$scalarVal=$val->scalarval(卡塔尔国;
对于复杂的数据类型,有七个函数特别有用,那八个函数都在xmlrpc.inc内:
$arr=xmlrpc_decode;
该函数再次来到三个PHP数组,当中包涵了xmlrpcval变量$xmlrpc_val之内的多少,那个数量现已被改变到PHP自身装有的变量类型。
$xmlrpc_val=xmlrpc_encode;
该函数再次来到多少个xmlrpcval类型的值,当中饱含了$phpval描述的PHP数据。对于数组和布局,此情势可以举行递归分析。注意,这里不设有对非基本数据类型的支撑。
4.3 服务器端
利用xmlrpcs.inc提供的类编排服务特别简单。要制造多少个劳动,大家依据如下方式创设xmlrpc_server的实例:
<?php $s=new xmlrpc_server( array(“examples.myFunc” =>
array(“function” => “foo”))); ?>
传递给xmlrpc_server布局函数的是二个体协会助进行数组的联名数组。进程“examples.myFunc”调用“foo”函数,由于这么些原因foo被叫做方法句柄。
编写方法句柄很简短。上面是一个办法句柄的龙骨: <?php function foo {
global $xmlrpcerruser; // 引进顾客错误代码值 //
$params是四个xmlrpcval对象的数组 if { // 错误条件 return new
xmlrpcresp(0, $xmlrpcerruser+1, // 客户错误1 “Error!”); } else { // 成功
return new xmlrpcresp(new xmlrpcval(“Fine!”, “string”卡塔尔State of Qatar; } } ?>
可以看到,程序检查了错误,如存在错误则赶回错误;不然一旦一切符合规律,则赶回描述操作成功音信的xmlrpcresp。
五、应用实例
在底下这几个事例中我们将组织贰个服务。对于给定的数值n,服务再次来到n*2。顾客端应用该服务计算5*2的值。
服务器端的代码如下: <?php include(“xmlrpc.inc”卡塔尔(قطر‎;
include(“xmlrpcs.inc”卡塔尔国; function foo { global $xmlrpcerruser; //
引入顾客错误代码值 // $params是xmlrpcval对象的叁个数组
$vala=$params->params[0]; $sval=$vala->scalarval();
$ret=$sval*2; return new xmlrpcresp(new xmlrpcval($ret, “int”)); }
$s=new xmlrpc_server( array(“product” => array(“function” =>
“foo”State of QatarState of QatarState of Qatar; ?> 客商端代码如下: <?php include(“xmlrpc.inc”卡塔尔(قطر‎; if
($HTTP_POST_VARS[“number”]!=””) { $f=new
xmlrpcmsg(‘product’,array(new xmlrpcval($HTTP_POST_VARS[“number”],
“int”))); $c=new xmlrpc_client(“/xmlrpc/servfoo.php”,
“luigi.melpomenia.com.ar”, 80); $c->setDebug; $v=$r->value(); if {
print “Number “. $HTTP_POST_VARS[“number”] . ” is ” .
$v->scalarval(卡塔尔国 . “<BTiggo>”; print
“<HPRADO>来自服务器的结果!<BKoleos><PRE>” . htmlentities.
“</PRE><H奇骏>n”; } else { print “操作退步: “; print “代码: ” .
$r->faultCode(卡塔尔(قطر‎ . ” 原因: ‘” .$r->faultString(卡塔尔.”‘<BSportage>”; } }
print “<FORM METHOD=”POST”> <INPUT NAME=”number” VALUE=”${number}”>
<input type=”submit” value=”go” name=”submit”></FORM><P>
输入三个数值”; ?>
停止语:XML_RPC服务的运转还提到任何众多底子设备和底工专门的事业,如遍及式进程的编目和目录机制,又如在编制程序语言中管理XML_RPC的越来越好接口等。有关XML_RPC和服务式Web的通信比非常多,让大家留神关切它们的上进呢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注