利用XML_RPC構(gòu)造和使用服務(wù)是很方便的。企業(yè)為自己提供的各種服務(wù)部署XML_RPC服務(wù)器,用戶(hù)、客戶(hù)軟件和客戶(hù)企業(yè)就可以使用這種服務(wù)構(gòu)造出高端服務(wù)或者面向最終用戶(hù)的應(yīng)用。這種提供更有效、 " /> 欧美XXXX69学生HD,6080yy亚洲久久无码,性欧美video

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

在PHP中利用XML技術(shù)構(gòu)造遠(yuǎn)程服務(wù)(下)

四、基于XML_RPC的Web服務(wù)
利用XML_RPC構(gòu)造和使用服務(wù)是很方便的。企業(yè)為自己提供的各種服務(wù)部署XML_RPC服務(wù)器,用戶(hù)、客戶(hù)軟件和客戶(hù)企業(yè)就可以使用這種服務(wù)構(gòu)造出高端服務(wù)或者面向最終用戶(hù)的應(yīng)用。這種提供更有效、廉價(jià)和優(yōu)質(zhì)服務(wù)的競(jìng)爭(zhēng)將極大地提高應(yīng)用服務(wù)的質(zhì)量。

但這里還存在一些問(wèn)題有待解決,例如怎樣編目、索引、搜索Web上的服務(wù)?UDDI試圖解決這個(gè)問(wèn)題,不過(guò)這個(gè)標(biāo)準(zhǔn)并不簡(jiǎn)單,而且業(yè)界對(duì)它的反應(yīng)也尚未明了。然而,在企業(yè)內(nèi)部應(yīng)用XML_RPC不僅能夠改善代碼的可重用性,而且還會(huì)帶來(lái)一種全新的分布式計(jì)算模式,在此后的數(shù)年中它必將成為一種重要的知識(shí)財(cái)富。XML_RPC的發(fā)展從解決分布式計(jì)算問(wèn)題以及成為服務(wù)式Web的基本層面開(kāi)始,從而獲得了一個(gè)非常好的開(kāi)端,其后必將緊隨著人們對(duì)該標(biāo)準(zhǔn)的熱衷。既然如此,現(xiàn)在就讓我們來(lái)看看XML_RPC的實(shí)際應(yīng)用吧!

4.1 在php應(yīng)用XML_RPC

對(duì)于提供Web服務(wù)來(lái)說(shuō),php是一種非常理想的語(yǔ)言。我們只需編寫(xiě)好php代碼然而把它放到一個(gè)合適的位置,就立即有了一個(gè)可通過(guò)URL“調(diào)用”的服務(wù)。php中的XML_RPC實(shí)現(xiàn)可能復(fù)雜也可能簡(jiǎn)單,但我們擁有許多種選擇。這里我們選用的是來(lái)自Useful Information Company的XML_RPC實(shí)現(xiàn),它的代碼和文檔可以從http://xmlrpc.usefulinc.com/下載。

這個(gè)XML_RPC實(shí)現(xiàn)的基本類(lèi)涉及兩個(gè)文件:

xmlrpc.inc:包含XML_RPC的php客戶(hù)端所需要的類(lèi)

xmlrpcs.inc:包含XML_RPC的php服務(wù)器所需要的類(lèi)

4.2 客戶(hù)端

編寫(xiě)XML_RPC客戶(hù)端意味著:

1.創(chuàng)建一個(gè)XML_RPC請(qǐng)求消息

2.設(shè)置XML_RPC參數(shù)

3.創(chuàng)建一個(gè)XML_RPC消息

4.發(fā)送消息

5.獲得應(yīng)答

6.解釋?xiě)?yīng)答

請(qǐng)看下面這個(gè)例子:

<?php
$f=new xmlrpcmsg('examples.getStateName',array(new xmlrpcval(14, "int")));
$c=new xmlrpc_client("/RPC2", "betty.userland.com", 80);
$r=$c->send($f);
$v=$r->value();
if (!$r->faultCode()) {
print "狀態(tài)代碼". $HTTP_POST_VARS["stateno"] . "是" .
$v->Scalarval() . "<BR>";
print "<HR>這是服務(wù)器的應(yīng)答<BR><PRE>" .
htmlentities($r->serialize()). "</PRE><HR>n";
} else {
print "錯(cuò)誤: ";
print "代碼: " . $r->faultCode() .
" 原因: '" .$r->faultString()."'<BR>";
}
?>


在這個(gè)例子中,我們先創(chuàng)建了一個(gè)調(diào)用“examples.getStateName”方法的XML_RPC消息,并傳遞了一個(gè)類(lèi)型為“int”值為14的整數(shù)參數(shù)。然后,我們創(chuàng)建了一個(gè)描述待調(diào)用URL(路徑、域和端口)的客戶(hù)。接著,我們發(fā)送了消息,接收應(yīng)答對(duì)象并檢查錯(cuò)誤。如果不存在錯(cuò)誤,我們就顯示結(jié)果。

編寫(xiě)RPC客戶(hù)程序時(shí)要用到的主要函數(shù)如下:

創(chuàng)建客戶(hù)用:

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

發(fā)送消息的方法是:

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

它返回的是xmlrpcresp的一個(gè)實(shí)例。我們所傳遞的消息是xmlrpcmsg的實(shí)例,它用如下方法創(chuàng)建:

$msg=new xmlrpcmsg($methodName, $parameterArray);

methodName是待調(diào)用的方法(過(guò)程)的名字,parameterArray是xmlrpcval對(duì)象的php數(shù)組。例如:

$msg=new xmlrpcmsg("examples.getStateName", array(new xmlrpcval(23, "int")));

xmlrpcval對(duì)象可以用如下形式創(chuàng)建:

<?php
$myVal=new xmlrpcval($stringVal);
$myVal=new xmlrpcval($ScalarVal, "int" | "boolean" | "string" | "double" | "dateTime.iso8601" | "base64");
$myVal=new xmlrpcval($arrayVal, "array" | "struct");
?>


第一種形式創(chuàng)建的是xmlrpc字符串值。第二種形式創(chuàng)建的是描述值和類(lèi)型的值。第三種形式通過(guò)在數(shù)組之類(lèi)的結(jié)構(gòu)中組合其他xmlrpc值創(chuàng)建復(fù)雜的對(duì)象,例如:

<?php
$myArray=new xmlrpcval(array(new xmlrpcval("Tom"), new xmlrpcval("Dick"),new xmlrpcval("Harry")), "array");
$myStruct=new xmlrpcval(array(
"name" => new xmlrpcval("Tom"),
"age" => new xmlrpcval(34, "int"),
"geek" => new xmlrpcval(1, "boolean")),"struct");
?>


應(yīng)答對(duì)象是xmlrpcresp類(lèi)型,通過(guò)調(diào)用客戶(hù)對(duì)象的send方法獲得。在服務(wù)器端,我們可以通過(guò)如下方式創(chuàng)建xmlrpcresp類(lèi)型的對(duì)象:

$resp=new xmlrpcresp($xmlrpcval);

而在客戶(hù)端,則使用如下方法從應(yīng)答獲取xmlrpcval:

$xmlrpcVal=$resp->value();

接下來(lái)我們就可以用下面這種方式獲取描述應(yīng)答結(jié)果的php變量:

$ScalarVal=$val->Scalarval();

對(duì)于復(fù)雜的數(shù)據(jù)類(lèi)型,有兩個(gè)函數(shù)非常有用,這兩個(gè)函數(shù)都在xmlrpc.inc內(nèi):

$arr=xmlrpc_decode($xmlrpc_val);

該函數(shù)返回一個(gè)php數(shù)組,其中包含了xmlrpcval變量$xmlrpc_val之內(nèi)的數(shù)據(jù),這些數(shù)據(jù)已經(jīng)被轉(zhuǎn)換成php本身具有的變量類(lèi)型。

$xmlrpc_val=xmlrpc_encode($phpval);

該函數(shù)返回一個(gè)xmlrpcval類(lèi)型的值,其中包含了$phpval描述的php數(shù)據(jù)。對(duì)于數(shù)組和結(jié)構(gòu),此方法能夠進(jìn)行遞歸分析。注意,這里不存在對(duì)非基本數(shù)據(jù)類(lèi)型(如base-64數(shù)據(jù),或者日期-時(shí)間數(shù)據(jù))的支持。

4.3 服務(wù)器

利用xmlrpcs.inc提供的類(lèi)編寫(xiě)服務(wù)非常簡(jiǎn)單。要?jiǎng)?chuàng)建一個(gè)服務(wù),我們按照如下方式創(chuàng)建xmlrpc_server的實(shí)例:

<?php
$s=new xmlrpc_server( array("examples.myFunc" =>
array("function" => "foo")));
?>

傳遞給xmlrpc_server構(gòu)造函數(shù)的是一個(gè)聯(lián)合數(shù)組的聯(lián)合數(shù)組。過(guò)程“examples.myFunc”調(diào)用“foo”函數(shù),由于這個(gè)原因foo被稱(chēng)為方法句柄。

編寫(xiě)方法句柄很簡(jiǎn)單。下面是一個(gè)方法句柄的骨架:

<?php
function foo ($params) {
global $xmlrpcerruser; // 引入用戶(hù)錯(cuò)誤代碼值
// $params是一個(gè)xmlrpcval對(duì)象的數(shù)組
if ($err) {
// 錯(cuò)誤條件
return new xmlrpcresp(0, $xmlrpcerruser+1, // 用戶(hù)錯(cuò)誤1
"Error!");
} else {
// 成功
return new xmlrpcresp(new xmlrpcval("Fine!", "string"));
}
}
?>


可以看到,程序檢查了錯(cuò)誤,如存在錯(cuò)誤則返回錯(cuò)誤(從$xmlrpcerruser+1開(kāi)始);否則如果一切正常,則返回描述操作成功信息的xmlrpcresp。

五、應(yīng)用實(shí)例
在下面這個(gè)例子中我們將構(gòu)造一個(gè)服務(wù)。對(duì)于給定的數(shù)值n,服務(wù)返回n*2??蛻?hù)端利用該服務(wù)計(jì)算5*2的值。

服務(wù)器端的代碼如下:

<?php
include("xmlrpc.inc");
include("xmlrpcs.inc");
function foo ($params)
{
global $xmlrpcerruser; // 引入用戶(hù)錯(cuò)誤代碼值
// $params是xmlrpcval對(duì)象的一個(gè)數(shù)組
$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")));
?>


客戶(hù)端代碼如下:

<?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(0);
$r=$c->send($f);
$v=$r->value();
if (!$r->faultCode()) {
print "Number ". $HTTP_POST_VARS["number"] . " is " .
$v->Scalarval() . "<BR>";
print "<HR>來(lái)自服務(wù)器的結(jié)果!<BR><PRE>" .
htmlentities($r->serialize()). "</PRE><HR>n";
} else {
print "操作失敗: ";
print "代碼: " . $r->faultCode() .
" 原因: '" .$r->faultString()."'<BR>";
}
}
print "<FORM METHOD="POST">
<INPUT NAME="number" VALUE="${number}">
<input type="submit" value="go" name="submit"></FORM><P>
輸入一個(gè)數(shù)值";
?>


結(jié)束語(yǔ):XML_RPC服務(wù)的運(yùn)作還涉及其他許多基礎(chǔ)設(shè)施和基礎(chǔ)工作,如分布式過(guò)程的編目和索引機(jī)制,又如在編程語(yǔ)言中處理XML_RPC的更好接口等。有關(guān)XML_RPC和服務(wù)式Web的報(bào)道非常多,讓我們密切關(guān)注它們的發(fā)展吧!

php技術(shù)在PHP中利用XML技術(shù)構(gòu)造遠(yuǎn)程服務(wù)(下),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美三级在线完整版免费 | 日韩精品欧美亚洲高清有无 | 男人就爱吃这套下载 | 91伊人久久大香线蕉 | 国产国产乱老熟女视频网站97 | 亚洲精品国产自在现线最新 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 忘忧草高清 | 国内精品伊人久久久影院 | 最近中文字幕mv手机免费高清 | 高清不卡伦理电影在线观看 | 国产骚妇BB网 | 国产亚洲视频在线播放香蕉 | 国产亚洲精品久久久久久白晶晶 | 全身无赤裸裸美女网站 | 学生精品国产在线视频 | 中文字幕人成人乱码亚洲影视S | 国产午夜精品理论片在线 | 久久久久久久99精品免费观看 | 岛国大片在线观看免费版 | 两百磅美女 | 牛牛在线1视频 | 大陆老熟女60岁 | 国产精品线路一线路二 | 日日噜噜夜夜躁躁狠狠 | 久久精品国产亚洲AV忘忧草蜜臀 | 日本学生VIDEOVIDEOS更新 日本性xxx | 无人区乱码区1卡2卡三卡在线 | 国产美女久久久久久久久久久 | 四虎国产精品永久一区高清 | 99九九免费热在线精品 | 美女内射视频WWW网站午夜 | 十八禁啪啦啪漫画 | 欧美黑人经典片免费观看 | 福利啪啪吧 | 乳色吐息未增删樱花ED在线观看 | 樱花草在线影视WWW日本动漫 | 久久毛片网站 | 亚洲成人网导航 | 国产三级在线免费观看 | 黄A无码片内射无码视频 |