国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:3日期:2023-12-22 11:16:59
四、基于XML_RPC的Web服務(wù) 利用XML_RPC構(gòu)造和使用服務(wù)是很方便的。企業(yè)為自己提供的各種服務(wù)部署XML_RPC服務(wù)器,用戶、客戶軟件和客戶企業(yè)就可以使用這種服務(wù)構(gòu)造出高端服務(wù)或者面向最終用戶的應(yīng)用。這種提供更有效、廉價(jià)和優(yōu)質(zhì)服務(wù)的競爭將極大地提高應(yīng)用服務(wù)的質(zhì)量。 但這里還存在一些問題有待解決,例如怎樣編目、索引、搜索Web上的服務(wù)?UDDI試圖解決這個(gè)問題,不過這個(gè)標(biāo)準(zhǔn)并不簡單,而且業(yè)界對它的反應(yīng)也尚未明了。然而,在企業(yè)內(nèi)部應(yīng)用XML_RPC不僅能夠改善代碼的可重用性,而且還會(huì)帶來一種全新的分布式計(jì)算模式,在此后的數(shù)年中它必將成為一種重要的知識(shí)財(cái)富。XML_RPC的發(fā)展從解決分布式計(jì)算問題以及成為服務(wù)式Web的基本層面開始,從而獲得了一個(gè)非常好的開端,其后必將緊隨著人們對該標(biāo)準(zhǔn)的熱衷。既然如此,現(xiàn)在就讓我們來看看XML_RPC的實(shí)際應(yīng)用吧! 4.1 在PHP中應(yīng)用XML_RPC 對于提供Web服務(wù)來說,PHP是一種非常理想的語言。我們只需編寫好PHP代碼然而把它放到一個(gè)合適的位置,就立即有了一個(gè)可通過URL“調(diào)用”的服務(wù)。PHP中的XML_RPC實(shí)現(xiàn)可能復(fù)雜也可能簡單,但我們擁有許多種選擇。這里我們選用的是來自Useful Information Company的XML_RPC實(shí)現(xiàn),它的代碼和文檔可以從http://xmlrpc.usefulinc.com/下載。 這個(gè)XML_RPC實(shí)現(xiàn)的基本類涉及兩個(gè)文件: xmlrpc.inc:包含XML_RPC的php客戶端所需要的類 xmlrpcs.inc:包含XML_RPC的php服務(wù)器所需要的類 4.2 客戶端 編寫XML_RPC客戶端意味著: 1.創(chuàng)建一個(gè)XML_RPC請求消息 2.設(shè)置XML_RPC參數(shù) 3.創(chuàng)建一個(gè)XML_RPC消息 4.發(fā)送消息 5.獲得應(yīng)答 6.解釋應(yī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è)類型為“int”值為14的整數(shù)參數(shù)。然后,我們創(chuàng)建了一個(gè)描述待調(diào)用URL(路徑、域和端口)的客戶。接著,我們發(fā)送了消息,接收應(yīng)答對象并檢查錯(cuò)誤。如果不存在錯(cuò)誤,我們就顯示結(jié)果。 編寫RPC客戶程序時(shí)要用到的主要函數(shù)如下: 創(chuàng)建客戶用: $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)用的方法(過程)的名字,parameterArray是xmlrpcval對象的php數(shù)組。例如: $msg=new xmlrpcmsg("examples.getStateName", array(new xmlrpcval(23, "int"))); xmlrpcval對象可以用如下形式創(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)建的是描述值和類型的值。第三種形式通過在數(shù)組之類的結(jié)構(gòu)中組合其他xmlrpc值創(chuàng)建復(fù)雜的對象,例如: <?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)答對象是xmlrpcresp類型,通過調(diào)用客戶對象的send方法獲得。在服務(wù)器端,我們可以通過如下方式創(chuàng)建xmlrpcresp類型的對象: $resp=new xmlrpcresp($xmlrpcval); 而在客戶端,則使用如下方法從應(yīng)答獲取xmlrpcval: $xmlrpcVal=$resp->value(); 接下來我們就可以用下面這種方式獲取描述應(yīng)答結(jié)果的PHP變量: $scalarVal=$val->scalarval(); 對于復(fù)雜的數(shù)據(jù)類型,有兩個(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本身具有的變量類型。 $xmlrpc_val=xmlrpc_encode($phpval); 該函數(shù)返回一個(gè)xmlrpcval類型的值,其中包含了$phpval描述的PHP數(shù)據(jù)。對于數(shù)組和結(jié)構(gòu),此方法能夠進(jìn)行遞歸分析。注意,這里不存在對非基本數(shù)據(jù)類型(如base-64數(shù)據(jù),或者日期-時(shí)間數(shù)據(jù))的支持。 4.3 服務(wù)器端 利用xmlrpcs.inc提供的類編寫服務(wù)非常簡單。要?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ù)組。過程“examples.myFunc”調(diào)用“foo”函數(shù),由于這個(gè)原因foo被稱為方法句柄。 編寫方法句柄很簡單。下面是一個(gè)方法句柄的骨架: <?php function foo ($params) { global $xmlrpcerruser; // 引入用戶錯(cuò)誤代碼值 // $params是一個(gè)xmlrpcval對象的數(shù)組 if ($err) { // 錯(cuò)誤條件 return new xmlrpcresp(0, $xmlrpcerruser+1, // 用戶錯(cuò)誤1 "Error!"); } else { // 成功 return new xmlrpcresp(new xmlrpcval("Fine!", "string")); } } ?> 可以看到,程序檢查了錯(cuò)誤,如存在錯(cuò)誤則返回錯(cuò)誤(從$xmlrpcerruser+1開始);否則如果一切正常,則返回描述操作成功信息的xmlrpcresp。 五、應(yīng)用實(shí)例 在下面這個(gè)例子中我們將構(gòu)造一個(gè)服務(wù)。對于給定的數(shù)值n,服務(wù)返回n*2。客戶端利用該服務(wù)計(jì)算5*2的值。 服務(wù)器端的代碼如下: <?php include("xmlrpc.inc"); include("xmlrpcs.inc"); function foo ($params) { global $xmlrpcerruser; // 引入用戶錯(cuò)誤代碼值 // $params是xmlrpcval對象的一個(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"))); ?> 客戶端代碼如下: <?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>來自服務(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é)束語:XML_RPC服務(wù)的運(yùn)作還涉及其他許多基礎(chǔ)設(shè)施和基礎(chǔ)工作,如分布式過程的編目和索引機(jī)制,又如在編程語言中處理XML_RPC的更好接口等。有關(guān)XML_RPC和服務(wù)式Web的報(bào)道非常多,讓我們密切關(guān)注它們的發(fā)展吧!
標(biāo)簽: PHP
主站蜘蛛池模板: 金沙县| 昌宁县| 襄樊市| 柳州市| 图片| 咸宁市| 东宁县| 奉节县| 四子王旗| 济源市| 宜君县| 闽侯县| 开鲁县| 霍州市| 梅州市| 沁源县| 巍山| 扎兰屯市| 石棉县| 泸州市| 黄龙县| 抚顺县| 鹤峰县| 伊宁县| 萝北县| 巴楚县| 顺昌县| 嘉禾县| 杭锦后旗| 资阳市| 仁化县| 张家川| 福州市| 泊头市| 绥江县| 阳信县| 丰镇市| 临汾市| 沅陵县| 社会| 宁乡县|