国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

在PHP中運用XML技術構造遠程服務(轉)

在PHP中運用XML技術構造遠程服務(轉)

更新時間:2022-05-06 文章作者:未知 信息來源:網絡 閱讀次數:

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

未來的Web將是以服務為中心的Web,XML_RPC標準使得編寫和應用服務變得非常簡單。本文介紹XML_RPC標準及其PHP實現,并通過實例示范了如何在PHP中開發XML_RPC服務和客戶程序。

一、服務式Web
從內容提供商所采用的簡單方法到UDDI(Universal Description,Discovery and Integration)的未來構想,業界已經有大量關于“服務式Web”的說明和評論。就Web的初創階段來說,它只是一個文檔的集散地,提供的只是一些可瀏覽的信息。隨著Web的發展,在Web上運行服務越來越具有吸引力。未來,Web將成為企業為客戶和其他企業提供便捷服務的載體。B2B和B2C模式間的協同就可以看成是一種服務式Web。

一個很重要的問題是,Web上究竟可以提供哪些服務?Web能夠提供的服務非常多,其中有些服務現在已經在使用,有些服務在不久的將來就會出現。為了說明問題,下面列出了一小部分可以通過Web提供的服務:

面向主題的垂直搜索引擎。
供用戶查找信息的知識庫。
用戶可以請教問題的專家系統。
銀行服務。
新聞和信息出版服務。
數字化支付相關的服務。
圖形處理服務。
衛生和健康服務。

那么,企業和組織通過Web提供服務的正確途徑是什么呢?這是一個很重要的問題。今天,有些服務提供HTML界面,它們通過文檔的形式提供服務,但在服務界面的背后隱藏著什么?在占領Web的競賽中,Web瀏覽器并不孤單,移動電話、手持設備以及微波爐之類的設備都想要訪問Web、查詢數據庫、轉換數據、提取信息,等等。要實現真正的服務式Web,在表現層(HTML)之下應該還有另外一層。

二、XML_RPC標準
XML或許是近10年來最為重要的標準,XML詞匯表(Vocabulary)為企業構造服務環境提供了基石。要構建服務式Web就有必要學習XML_RPC標準,這不僅是因為XML_RPC對于把服務放到Web上很有用,而且因為XML_RPC是一種已經成形的、很容易采用的標準。對于B2B服務來說,提供服務的標準是極其重要的,共同遵循標準的公司可以利用其它公司提供的服務獲得快速的增長。無法想象在各種私有的服務標準之上可以建立起真正的服務式Web,服務必須有一種可以遵循的標準。

XML_RPC是一種面向Internet分布式處理的標準。RPC即為Remote Procedure Call(遠程過程調用)的縮寫,它是一種遠程調用機制,用于調用可能駐留在其他機器之上以及可能用其他語言編寫的過程。遠程過程調用是分布式計算的重要支柱。例如,在一個分布式計算環境中,我們可以尋找和利用在其他機器上運行的執行加法和減法操作的過程,執行加法操作的過程可能用APL編寫、在RS6000機器上運行,執行減法操作的過程可能用C編寫、在Unix上運行。其他要使用這種分布式計算器的開發者同樣可以利用它們,或者他也可以選用另外更好的計算器。

在RPC中,過程(Procedure)是最主要的構件,服務器提供的就是供客戶端調用的過程。過程可以接收參數并返回結果。XML_RPC以HTTP作為協議載體,通過發送和接收數據的XML詞匯表實現RPC機制。XML_RPC服務器接收XML_RPC請求并返回XML_RPC應答,XML_RPC客戶程序發送XML_RPC請求并接收XML_RPC應答。服務器和客戶必須按照XML_RPC標準的要求處理應答和請求。

三、XML_RPC協議
完整的XML_RPC規范可以在http://www.xmlrpc.com/spec找到。下面是其要點說明。

3.1 XML_RPC請求

XML_RPC請求應該是HTTP POST請求,它的正文是XML格式。請求的XML部分格式如下:

<?xml version="1.0" ?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>


指定數據發送到哪里的URL并未在這里指定。如果服務器專門用來進行RPC處理,它可能是“/”。上述XML文檔中的有效載荷是一個“methodCall”結構。methodCall必須包含一個“methodName”子元素,“methodName”子元素包含一個描述待調用方法的字符串。如何解釋“methodName”的內容完全由服務器決定,例如它可以是一個執行文件的名字,可以是數據庫中記錄的名字,或者任何其他東西。如果過程接收參數,“methodCall”可以包含一個“params”元素以及若干個“param”子元素。每一個“param”元素包含一個帶有類型描述符的值,類型描述符如下表所示:


標記 說明
<i4>或<int> 四字節的帶符號整數,如12
<boolean> 0(false),或1(true)
<string> 字符串,如“Hello World”
<double> 雙精度帶符號浮點數,如-12.214
<dateTime.iso8601> 日期/時間,如19980717T14:08:55
<base64> base64編碼的二進制數據,如eW91IGbid0IHJlQgdGhpcyE


3.1.1 結構

值可以是一個結構,結構用<struct>元素描述。每個<struct>包含多個<member>,每個<member>包含一個<name>和一個<value>。下面是一個由兩個元素構成的結構:

<struct>
<member>
<name>name</name>
<value><string>member1</string></value>
</member>
<member>
<name>member2</name>
<value><i4>19</i4></value>
</member>
</struct>


<struct>可以嵌套,任意<value>可以包含<struct>或者任意其它類型,包括<array>。

3.1.2 數組

值可以是數組類型,數組用<array>元素描述。每個<array>元素包含一個<data>元素,<data>元素里面可以包含任意多個<value>元素。下面是數組元素的一個例子:

<array>
<data>
<value><boolean>0</boolean></value>
<value><i4>9</i4></value>
<value><string>Hello</string></value>
</data>
</array>


<array>元素沒有名字。如前例所示,<array>元素的值可以是各種類型。<array>元素可以嵌套,任何<value>都可以包含<array>或者其他類型,如上面介紹的<struct>。

3.2 XML_RPC應答

XML_RPC應答是一個HTTP應答,內容類型是text/xml。應答正文的格式如下:

<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>ABCDEFG</string></value>
</param>
</params>
</methodResponse>


<methodResponse>可能包含一個<params>結構,或者可能包含一個<fault>結構,具體由過程調用是否成功決定。<params>結構與XML請求中的一樣,<fault>元素的語法如下:

<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Error!</string></value>
</member>
</struct>
</value>
</fault>


四、基于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的報道非常多,讓我們密切關注它們的發展吧!

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        8x福利精品第一导航| 懂色av中文字幕一区二区三区| 日韩黄色片在线观看| 91久久精品一区二区二区| 亚洲精品免费在线| 欧美精品777| 久久99精品国产.久久久久| 国产亚洲午夜高清国产拍精品 | 久久精品人人做人人综合| 国产毛片一区二区| 亚洲视频综合在线| 欧美巨大另类极品videosbest| 久久精品国产亚洲高清剧情介绍| 久久久久久久免费视频了| 99精品视频一区二区| 天天综合色天天综合色h| 久久免费午夜影院| 欧美在线你懂得| 美国十次了思思久久精品导航| 久久九九久精品国产免费直播| 色噜噜久久综合| 精品在线你懂的| 亚洲另类在线制服丝袜| 欧美mv日韩mv| 欧美亚洲图片小说| 丁香天五香天堂综合| 五月激情综合婷婷| 国产精品国产自产拍高清av| 91精品国产综合久久久久久| 国产91丝袜在线播放| 日本成人在线视频网站| 亚洲免费资源在线播放| 久久久无码精品亚洲日韩按摩| 欧洲视频一区二区| 成人的网站免费观看| 麻豆国产一区二区| 亚洲成国产人片在线观看| 国产精品久久久99| 久久久www成人免费无遮挡大片| 欧美精品一级二级三级| 91无套直看片红桃| 国产1区2区3区精品美女| 麻豆一区二区99久久久久| 亚洲午夜视频在线| 亚洲日本欧美天堂| 国产精品欧美综合在线| 2021国产精品久久精品| 91精品国产欧美一区二区| 欧美日韩在线直播| 91久久一区二区| 91丝袜高跟美女视频| 不卡一区中文字幕| 成人av在线网站| 91在线看国产| 91福利精品视频| 欧美伊人久久大香线蕉综合69 | 成人深夜福利app| 风间由美一区二区三区在线观看| 激情五月播播久久久精品| 极品少妇xxxx精品少妇| 国产麻豆一精品一av一免费| 韩国av一区二区| 国产99久久久久久免费看农村| 国产精品一区二区果冻传媒| 久久成人麻豆午夜电影| 激情综合五月天| 国产成人夜色高潮福利影视| 懂色av一区二区三区蜜臀| 本田岬高潮一区二区三区| 东方aⅴ免费观看久久av| 成人性视频免费网站| 92精品国产成人观看免费| 99视频有精品| 欧美高清视频在线高清观看mv色露露十八 | 成人精品gif动图一区| 波多野结衣中文字幕一区二区三区| 成人精品视频一区二区三区| 91免费在线视频观看| 欧美日韩免费一区二区三区视频| 欧美久久久久久久久| 精品国产一区二区亚洲人成毛片| 久久久亚洲精品石原莉奈| 国产精品久久三| 亚洲第一综合色| 精品一区二区综合| 成人app网站| 日韩一区二区麻豆国产| 日本一区二区三区电影| 亚洲国产人成综合网站| 麻豆免费精品视频| 白白色亚洲国产精品| 欧美日本一道本在线视频| 久久亚洲精精品中文字幕早川悠里| 国产精品乱人伦| 免费观看成人av| 91丨porny丨中文| 精品对白一区国产伦| 亚洲激情图片qvod| 国产一区二区h| 欧美视频三区在线播放| 久久久久久久久久看片| 亚洲1区2区3区4区| 成人国产免费视频| 日韩美女视频在线| 亚洲伊人色欲综合网| 国产69精品久久99不卡| 69av一区二区三区| 一区二区三区高清不卡| 国产在线精品国自产拍免费| 欧美日韩午夜精品| 国产精品理论片| 狠狠色狠狠色综合系列| 欧美性猛交xxxxxxxx| 国产精品福利电影一区二区三区四区| 日本中文字幕不卡| 欧美日韩免费高清一区色橹橹| 国产精品福利在线播放| 国产精品自拍网站| 精品国产免费视频| 免费不卡在线观看| 欧美日韩情趣电影| 亚洲一区二区高清| 91久久久免费一区二区| 自拍偷拍亚洲综合| 99久久婷婷国产| 欧美国产一区二区在线观看| 精品在线免费观看| 精品剧情在线观看| 国产一区二区三区精品视频| 久久综合视频网| 国产一区二区三区最好精华液| 91精品国产麻豆国产自产在线| 亚洲h在线观看| 欧美日韩高清一区二区三区| 亚洲图片欧美视频| 欧美高清激情brazzers| 午夜久久久久久电影| 欧美日韩成人在线| 青青草原综合久久大伊人精品优势| 欧美色图12p| 日韩精品电影在线观看| 91精品国产综合久久久久久| 另类综合日韩欧美亚洲| 欧美哺乳videos| 国产精品亚洲午夜一区二区三区| 久久久精品天堂| 99久久er热在这里只有精品15| 亚洲欧美另类在线| 欧美日韩中文精品| 久久精品99国产精品日本| 日韩免费性生活视频播放| 国产一区二区三区在线观看免费 | 国产精品一区免费视频| 日本一区二区高清| 色诱视频网站一区| 人人精品人人爱| 中文字幕欧美国产| 欧洲精品在线观看| 日韩av不卡一区二区| 久久精品一区二区| 日本韩国一区二区| 麻豆一区二区三| 国产精品日日摸夜夜摸av| 欧美吻胸吃奶大尺度电影| 久久99国产精品麻豆| 中文字幕av一区二区三区免费看| 色久优优欧美色久优优| 捆绑紧缚一区二区三区视频| 国产精品另类一区| 欧美一区二区大片| 不卡的电视剧免费网站有什么| 亚洲一区二区三区小说| 精品少妇一区二区三区日产乱码 | 一区二区三区精密机械公司| 日韩欧美一级特黄在线播放| 成人av网在线| 狠狠色狠狠色综合系列| 一级做a爱片久久| 欧美极品aⅴ影院| 日韩欧美亚洲国产另类| 91成人免费电影| 高清久久久久久| 激情亚洲综合在线| 天堂成人免费av电影一区| 中文字幕一区二区日韩精品绯色| 日韩免费电影网站| 5858s免费视频成人| 一本一本大道香蕉久在线精品| 老司机精品视频线观看86| 亚洲国产精品精华液网站| 国产精品国产精品国产专区不蜜 | 一区二区三区精品久久久| 久久久午夜电影| 日韩欧美视频在线| 欧美精品在线视频| 欧美日本韩国一区二区三区视频| 日本高清不卡在线观看| 91网址在线看| 91在线视频网址| 91网站最新地址|