糯米文學吧

位置:首頁 > 設計 > 網頁設計

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

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

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

一、服務式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規範可以在找到。下面是其要點說明。

3.1 XML_RPC請求

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

<?xml version="1.0" ?>

<methodCall>

<methodName>tateName</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

<8601> 日期/時間,如19980717T14:08:55

<base64> base64編碼的二進位制資料,如eW91IGbid0IHJlQgdGhpcyE

3.1.1 結構

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

<struct>

<member>

<name>name</name>

<value><string>member1</string></value>

</member>

<member>

<name>member2</name>

<value><i4>19</i4></value>

</member>

</struct>

可以巢狀,任意可以包含或者任意其它型別,包括。

3.1.2 陣列

值可以是陣列型別,陣列用元素描述。每個元素包含一個元素,元素裡面可以包含任意多個元素。下面是陣列元素的一個例子:

<array>

<data>

<value><boolean>0</boolean></value>

<value><i4>9</i4></value>

<value><string>Hello</string></value>

</data>

</array>

元素沒有名字。如前例所示,元素的值可以是各種型別。元素可以巢狀,任何都可以包含或者其他型別,如上面介紹的。

3.2 XML_RPC應答

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

<?xml version="1.0"?>

<methodResponse>

<params>

<param>

<value><string>ABCDEFG</string></value>

</param>

</params>

</methodResponse>

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

<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>