日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

在PHP中利用XML技術構造遠程服務(下)

瀏覽:23日期:2023-12-22 11:16:59
四、基于XML_RPC的Web服務 利用XML_RPC構造和使用服務是很方便的。企業為自己提供的各種服務部署XML_RPC服務器,用戶、客戶軟件和客戶企業就可以使用這種服務構造出高端服務或者面向最終用戶的應用。這種提供更有效、廉價和優質服務的競爭將極大地提高應用服務的質量。 但這里還存在一些問題有待解決,例如怎樣編目、索引、搜索Web上的服務?UDDI試圖解決這個問題,不過這個標準并不簡單,而且業界對它的反應也尚未明了。然而,在企業內部應用XML_RPC不僅能夠改善代碼的可重用性,而且還會帶來一種全新的分布式計算模式,在此后的數年中它必將成為一種重要的知識財富。XML_RPC的發展從解決分布式計算問題以及成為服務式Web的基本層面開始,從而獲得了一個非常好的開端,其后必將緊隨著人們對該標準的熱衷。既然如此,現在就讓我們來看看XML_RPC的實際應用吧! 4.1 在PHP中應用XML_RPC 對于提供Web服務來說,PHP是一種非常理想的語言。我們只需編寫好PHP代碼然而把它放到一個合適的位置,就立即有了一個可通過URL“調用”的服務。PHP中的XML_RPC實現可能復雜也可能簡單,但我們擁有許多種選擇。這里我們選用的是來自Useful Information Company的XML_RPC實現,它的代碼和文檔可以從http://xmlrpc.usefulinc.com/下載。 這個XML_RPC實現的基本類涉及兩個文件: xmlrpc.inc:包含XML_RPC的php客戶端所需要的類 xmlrpcs.inc:包含XML_RPC的php服務器所需要的類 4.2 客戶端 編寫XML_RPC客戶端意味著: 1.創建一個XML_RPC請求消息 2.設置XML_RPC參數 3.創建一個XML_RPC消息 4.發送消息 5.獲得應答 6.解釋應答 請看下面這個例子: <?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 "狀態代碼". $HTTP_POST_VARS["stateno"] . "是" . $v->scalarval() . "<BR>"print "<HR>這是服務器的應答<BR><PRE>" . htmlentities($r->serialize()). "</PRE><HR>n"} else { print "錯誤: "print "代碼: " . $r->faultCode() . " 原因: '" .$r->faultString()."'<BR>"} ?> 在這個例子中,我們先創建了一個調用“examples.getStateName”方法的XML_RPC消息,并傳遞了一個類型為“int”值為14的整數參數。然后,我們創建了一個描述待調用URL(路徑、域和端口)的客戶。接著,我們發送了消息,接收應答對象并檢查錯誤。如果不存在錯誤,我們就顯示結果。 編寫RPC客戶程序時要用到的主要函數如下: 創建客戶用: $client=new xmlrpc_client($server_path, $server_hostname, $server_port); 發送消息的方法是: $response=$client->send($xmlrpc_message); 它返回的是xmlrpcresp的一個實例。我們所傳遞的消息是xmlrpcmsg的實例,它用如下方法創建: $msg=new xmlrpcmsg($methodName, $parameterArray); methodName是待調用的方法(過程)的名字,parameterArray是xmlrpcval對象的php數組。例如: $msg=new xmlrpcmsg("examples.getStateName", array(new xmlrpcval(23, "int"))); xmlrpcval對象可以用如下形式創建: <?php $myVal=new xmlrpcval($stringVal); $myVal=new xmlrpcval($scalarVal, "int" | "boolean" | "string" | "double" | "dateTime.iso8601" | "base64"); $myVal=new xmlrpcval($arrayVal, "array" | "struct"); ?> 第一種形式創建的是xmlrpc字符串值。第二種形式創建的是描述值和類型的值。第三種形式通過在數組之類的結構中組合其他xmlrpc值創建復雜的對象,例如: <?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"); ?> 應答對象是xmlrpcresp類型,通過調用客戶對象的send方法獲得。在服務器端,我們可以通過如下方式創建xmlrpcresp類型的對象: $resp=new 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=new xmlrpc_server( array("examples.myFunc" => array("function" => "foo"))); ?> 傳遞給xmlrpc_server構造函數的是一個聯合數組的聯合數組。過程“examples.myFunc”調用“foo”函數,由于這個原因foo被稱為方法句柄。 編寫方法句柄很簡單。下面是一個方法句柄的骨架: <?php function foo ($params) { global $xmlrpcerruser; // 引入用戶錯誤代碼值 // $params是一個xmlrpcval對象的數組 if ($err) { // 錯誤條件 return new xmlrpcresp(0, $xmlrpcerruser+1, // 用戶錯誤1 "Error!"); } else { // 成功 return new xmlrpcresp(new xmlrpcval("Fine!", "string")); } } ?> 可以看到,程序檢查了錯誤,如存在錯誤則返回錯誤(從$xmlrpcerruser+1開始);否則如果一切正常,則返回描述操作成功信息的xmlrpcresp。 五、應用實例 在下面這個例子中我們將構造一個服務。對于給定的數值n,服務返回n*2。客戶端利用該服務計算5*2的值。 服務器端的代碼如下: <?php include("xmlrpc.inc"); include("xmlrpcs.inc"); function foo ($params) { 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"))); ?> 客戶端代碼如下: <?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>來自服務器的結果!<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> 輸入一個數值"?> 結束語:XML_RPC服務的運作還涉及其他許多基礎設施和基礎工作,如分布式過程的編目和索引機制,又如在編程語言中處理XML_RPC的更好接口等。有關XML_RPC和服務式Web的報道非常多,讓我們密切關注它們的發展吧!
標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜在线视频观看日韩17c| 日韩高清在线不卡| 国产精品二区不卡| 精品国产欧美日韩| 久久精品免费看| 久久亚洲精品中文字幕| 久久尤物视频| 国产白浆在线免费观看| 欧美久久天堂| 精品中文字幕一区二区三区| 久久国产日本精品| 韩国三级一区| 福利一区和二区| 日韩毛片在线| 一本色道久久精品| 婷婷精品在线| 国产精品宾馆| 国产精品不卡| 在线看片不卡| 日本视频一区二区| 久久超级碰碰| 日韩电影免费网站| 欧美日韩视频| 五月国产精品| 精品国产一区二| 久久精品高清| 日韩在线电影| 国产精品1luya在线播放| 黄色aa久久| 亚洲欧洲日本mm| 欧美日韩一区自拍| 成人国产精品一区二区免费麻豆| 在线成人直播| 国产精品久久久久久av公交车 | 91视频一区| 狠狠干成人综合网| 日韩av资源网| 中文字幕在线官网| 免费观看在线色综合| 久久成人高清| 欧美在线亚洲综合一区| 亚洲理论在线| 国产中文字幕一区二区三区| 婷婷久久一区| 国产精品嫩模av在线| 欧美天堂视频| 日韩精品高清不卡| 91亚洲国产| 亚洲精品日韩久久| 精品国产免费人成网站| 日韩在线卡一卡二| 大香伊人久久精品一区二区| 美女精品网站| 国产精品yjizz视频网| 丝袜美腿高跟呻吟高潮一区| 精品亚洲成人| 亚洲免费成人| 精品中文字幕一区二区三区 | 激情久久五月| 国产亚洲精品美女久久久久久久久久| 国产一区二区三区不卡av | 亚洲精品在线观看91| 国产精品香蕉| 亚洲一区二区毛片| 国产资源在线观看入口av| 日韩精品乱码av一区二区| 在线成人动漫av| 国产日本久久| 黄色欧美日韩| www.51av欧美视频| **爰片久久毛片| 亚洲少妇在线| 日韩欧美视频专区| 日韩av一二三| 9色国产精品| 日韩中文在线电影| 国产精品主播| 在线免费观看亚洲| 美女网站视频一区| 国产精品1luya在线播放| 亚洲精品乱码| 亚洲综合日韩| 亚洲高清av| 丁香婷婷久久| 日韩av一区二| 亚洲最新av| 怡红院精品视频在线观看极品| av最新在线| 美女国产精品久久久| 日韩精品免费观看视频| 亚洲欧美日韩精品一区二区| 日本在线啊啊| 韩日一区二区| 欧美精品91| 国产丝袜一区| 欧美精品中文字幕亚洲专区| 亚洲另类视频| 一区二区精彩视频| 欧美成人午夜| 日韩激情一区| av高清不卡| 国产一区二区三区国产精品| 欧美黑人巨大videos精品| 欧美精品三级在线| 日本欧美韩国一区三区| 亚洲天堂日韩在线| 中文视频一区| 日av在线不卡| 日韩影院免费视频| 中文一区一区三区免费在线观| 国产视频久久| 亚洲一区日本| 日韩中文字幕91| 视频一区二区三区在线| 日韩网站在线| 国产一级久久| 99国产精品久久久久久久成人热| 久久国产免费| 欧美美女一区| 狠狠爱www人成狠狠爱综合网| 一区在线观看| 美女精品一区| 免费国产亚洲视频| 日本亚洲欧美天堂免费| 日韩国产欧美在线视频| 青草综合视频| 国产精品日本一区二区不卡视频| 国产精品1区在线| 欧美激情91| 免费看一区二区三区| 精品精品久久| 欧美天堂视频| 欧美特黄a级高清免费大片a级| 尤物精品在线| 亚洲精品黄色| 国产伦精品一区二区三区千人斩| 欧美午夜三级| 久久99偷拍| 成人一二三区| 蜜臀久久99精品久久一区二区| 欧美在线影院| 日韩精彩视频在线观看| 久久99视频| 日韩在线看片| 久久在线电影| 午夜宅男久久久| 亚洲精品激情| 精品国产亚洲一区二区三区| 一区二区三区四区日本视频| 好吊一区二区三区| 亚洲va久久| 欧美精品不卡| 中文字幕系列一区| 亚洲黄色在线| 欧美日本久久| 日韩免费视频| 免费人成在线不卡| 久久a爱视频| 国产91久久精品一区二区| 免费精品视频| 国产精品.xx视频.xxtv| 久久久水蜜桃av免费网站| 亚洲最新av| 精品视频在线一区二区在线| 亚洲国产成人精品女人| 欧美日韩调教| 日韩精品水蜜桃| 日精品一区二区三区| 国产成人精品福利| 99热精品在线观看| 国产精品久久久久久妇女| 香蕉久久精品| 国产区精品区| 1024精品一区二区三区| 日本亚洲欧洲无免费码在线| 成人在线免费观看网站| 中日韩男男gay无套| 国产日韩免费| 午夜日韩av| 麻豆视频一区二区| 午夜在线精品偷拍| 国产一区二区三区四区二区| 亚洲少妇诱惑| 国产精品久久久久久久免费观看 | 国产69精品久久| 久久午夜视频| 成人高清一区| 色狠狠一区二区三区| 日本欧美不卡| 欧美日韩夜夜| 国产精品呻吟| 国产成人a视频高清在线观看| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲91视频| 欧美综合精品| 激情综合网站| 免费在线成人| 自拍自偷一区二区三区| 欧洲av一区二区| 国产探花在线精品一区二区|