利用XML_RPC構造和使用服務是很方便的。企業為自己提供的各種服務部署XML_RPC服務器,用戶、客戶軟件和客戶企業就可以使用這種服務構造出高端服務或者面向最終用戶的應用。這種提供更有效、 " /> 一本到高清视频在线观看三区,女人高潮时一吸一夹,翁熄性放纵交换300章

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

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

四、基于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技術在PHP中利用XML技術構造遠程服務(下),轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 在线视频 国产精品 中文字幕 | 嫩草国产精品99国产精品 | 国产在线观看www鲁啊鲁免费 | 伊人久久综在合线亚洲 | 亚洲第一伊人 | 久久精品熟一区二区三区 | 国产精品亚洲精品久久国语 | 国产亚洲中文字幕视频 | 杨幂被视频在线观看 | 亚洲一区精品伊人久久伊人 | 手机在线免费 | 日日a.v拍夜夜添久久免费 | 99精品欧美一区二区三区美图 | 玉林天天论坛 | 天堂无码人妻精品AV一区 | 免费久久狼人香蕉网 | 国产亚洲精品久久播放 | 久久精品热老司机 | 国产色婷亚洲99精品AV在线 | 亚洲精品无码不卡在线播放he | 无码人妻丰满熟妇区五十路久久 | 亚洲综合无码一区二区 | 国产AV精品白浆一区二 | 亚洲视频在线看 | 野花日本大全免费高清完整版 | 国产人妻人伦精品久久无码 | 老师别揉我胸啊嗯小说 | 国产免费看黄的私人影院 | 特级做A爰片毛片免费看108 | 鸥美一级黄色片 | 中国欧美日韩一区二区三区 | 久拍国产在线观看 | 波多野结衣教师系列6 | 伊人久久网站 | 视频一区视频二区在线观看 | 蜜桃日本免费观看MV | 国产 浪潮AV性色四虎 | 免费观看视频成人国产 | 色老头色老太aaabbb | 男男女女爽爽爽视频免费 | 欧美性xxx极品 |