在PHP中利用XML技術構造遠程服務(下)
2019-11-02 14:07:38
供稿:網友
四、基于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);