在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程式碼然而把它放到一個合適的位置,就立即有了一個可透過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_portent=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 {

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

PHP是一種服務器端腳本語言,用於動態網頁開發和服務器端應用程序。 1.PHP是一種解釋型語言,無需編譯,適合快速開發。 2.PHP代碼嵌入HTML中,易於網頁開發。 3.PHP處理服務器端邏輯,生成HTML輸出,支持用戶交互和數據處理。 4.PHP可與數據庫交互,處理表單提交,執行服務器端任務。

C 通過第三方庫(如TinyXML、Pugixml、Xerces-C )與XML交互。 1)使用庫解析XML文件,將其轉換為C 可處理的數據結構。 2)生成XML時,將C 數據結構轉換為XML格式。 3)在實際應用中,XML常用於配置文件和數據交換,提升開發效率。
