使用php來實現網路服務
來源:互聯網
上載者:User
作者:samisa
以下文中的翻譯名稱對照表 :
payload: 交談內容
object: 執行個體
function: 函數
使用 php來實現網路服務
使用架構: WSO2 WSF/PHP
安裝環境: windows 或者 linux
(厭惡於眼下電腦文章夾雜無數難懂的翻譯以及術語,此處盡量使用口語以及漢語。)
WSMessages 類:
在調用網路服務的過程中,需要兩個訊息,發送的訊息和接受的訊息,又來有往方能來往不是。 WSMessages 這個類就是在 Web services framework for php (簡稱 WSF)這個開源架構中,用來封裝這兩個訊息的類。
WSMessages 有一個很重要的變數 str來儲存訊息內容,以 xml格式來儲存“有效載荷” (他們把這個叫做 payload,我查英文字典,就是這個意思,但是它來回的出現,反覆的出現,今觀之,也就是交談內容,實際上就是除去那些 xml的定義,以及一些其他的所謂‘命名空間' ->namespace的定義而已。要搞清楚什麼是命名空間,請查看 xml的 W3C定義 )。有效載荷實在是莫名其妙,我以後還是用‘交談內容'來指代它把。
如果你通過客戶程式發送一個請求,那麼你需要構造一個 WSMessage 的執行個體,並且用 xml形式的交談內容填寫好這個執行個體。對應請求的回應,也還是一個‘交談內容'會通過你的程式返回,並且返回的東西也仍然是一個 WSMessage 執行個體。
也就是說,你的用戶端函數掉應一個網路服務,那麼他的傳回值也是一個 WSMessage 執行個體。
你可以在一個函數中發送請求,調用網路服務的程式,並且把返回內容放在 WSMessage執行個體中,並且讓函數返回這個 WSMessage執行個體。
WSMessage 更傾向於發送和接受比較複雜的內容比如有附件什麼的。下面就來詳細解釋一下如何使用 WSMessage 來實現用戶端和服務端的交流。
處理交談內容:
在此之前已經講解過如何使用 php來建立網路服務,並且已經做了一個簡單的客戶 -服務端程式來說明工作流程。但是這些程式並沒有深入的解釋我們怎麼處理‘交談內容'。換句話來說,我們只是把 xml格式的交談內容發送到了服務端,但並沒有想到去處理它。在這裡,我們來詳細的解釋一下如何處理交談內容並且把它用到計算程式中去。
交談內容是一個商業邏輯定義的內容,並且用 SOAP( Simple Object Access Protocol)來封裝的,(請參見 SOAP w3c的文章)。讓我們用個例子來說明如何計算一個階乘吧。
用戶端需要發送的交談內容:
<getFactorial>
<param>6</param>
</getFactorial>
服務端需要明白這個交談內容並且把變數分辨出來並且計算它的階乘。下面就是服務端程式:
function getFactorial ( $message ) {
$simplexml = new SimpleXMLElement ( $message -> str ) ;
$value = $simplexml -> param [ 0 ] ;
$result = factorial ( $value ) ;
$responsePayloadString = <<<XML
<getFactorialResponse>
<result> $result </result>
</getFactorialResponse>
XML;
return $responsePayloadString ;
}
第 3行,我們用輸入的‘交談內容'建立了一個 simpleXmlElement 的執行個體。你可以看到,輸入的交談內容被儲存到了通過函數參數傳遞進來的 WSMessage 執行個體 $message的 str變數中。註: SimpleXml是一個 php的擴充,用於處理 xml檔案或者字串。 WSO2 WSF/PHP並沒有規定我們必須使用哪一個 php擴充來處理 xml。你可以使用你喜歡的人和 xml php 擴充來處理,比如 domdocument, saxdom之類。
第 4行將交談內容中的參數值提取出來,這表示服務程式需要知道如何理解這些參數,比如說參數類型之類的東西。(正常來說需要在交談內容中說明這個參數的類型)。函數中剩下的就是正常的處理階乘。在第六行,階乘通過調用其他函數被計算出來。從 8到 12行,回複的交談內容也被寫好並且准被返回此內容。第 14行我們返回回複的交談內容。
回複的交談內容應該差不多是這樣的:
<getFactorialResponse>
<result>720</result>
</getFactorialResponse>
同樣的,用戶端也可以用同樣的方法處理回複的交談內容:
$response = $client -> request ( $reqestPayloadString ) ;
$simplexml = new SimpleXMLElement ( $response -> str ) ;
echo "Result = " . $simplexml -> result [ 0 ] . "<br/>" ;
在第 3行,用回複的交談內容建立了一個 SimpleXMLElement 執行個體。同樣的 $response 也是一個 WSMessage的執行個體,我們可以訪問他的成員變數 str,這個變數儲存了 xml格式的回複的交談內容。我們把它交給一個 SimpleXMLElement 建構函式,由此建立一個 SimpleXMLElement的執行個體。然後我們就可以訪問結果元素 (或者叫節點? element, xml裡面可以稱之為元素,但對於樹狀結構的它來說,節點也不為過? )
現在你應該學會如何處理交談資訊中的內容,不管是用戶端的申請也好還是服務端的回應也好。
註:在服務端的 getFactorial函數 (14行 ),你可以之間返回一個 WSmessage而不是一個回複的交談內容。你可以用下面的這一小段程式來實現這個功能。
$outMessage = new WSMessage( $responsePayloadString );
return $outMessage ;
這其實也就是說服務端程式及可以返回 xml格式的交談內容也可以返回 WSMessage的執行個體
完整的程式將在這篇文章的末尾附上。
跟蹤訊息
通過 WSO2 Web services framework for PHP ,你可以跟蹤 SOAP訊息被用戶端發出,然後用戶端又收到了來自服務端的訊息,(即他們的交談內容)。網路客戶服務類, WSClient 有兩個函數可以實現這個目的: getLastReauest()和 getLastResponse()。用戶端在使用 request()這個函數以後,你可以通過這兩個函數去得到交談資訊。
$response = $client -> request ( $reqestPayloadString ) ;
printf ( "<br/> Request = %s </br>" ,
htmlspecialchars ( $client -> getLastRequest ())) ;
printf ( "<br/> Response = %s </br>" ,
htmlspecialchars ( $client -> getLastResponse ())) ;
以上的程式片段會顯示 request()這個函數實現的請求與回複的內容。
實際上,這段程式差不多會輸出這樣的東西:
Request = <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Header/><soapenv:Body><getFactorial> <param>6</param> </getFactorial></soapenv:Body></soapenv:Envelope>
Response = <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Header/><soapenv:Body><getFactorialResponse> <result>720</result> </getFactorialResponse></soapenv:Body></soapenv:Envelope>
跟蹤 SOAP訊息對於研究呼叫的服務是非常有用的,特別是對於尋找服務和用戶端的 bug。比如說,你可以確認所有的用戶端發出的訊息以及服務端回複的訊息,並且,你可以確認交談內容的格式 (用戶端的以及服務端的。 )
Debugging(這個詞是如此的普遍,那麼我在這裡就不翻譯它了,儘管我的夢想是有一天程式用中文來寫,顯而易見的是這個夢已經離我們越來越遙遠。 )
使用者在使用 php WSF有時會碰到兩個問題:
安裝 wsf。 你怎麼能確定這個 wsf已經正常工作了?好吧,第一,你可以通過 phpinfo()這個函數來檢查, (要是你不知道這個函數以及怎麼使用它,呃,查查 php手冊吧。 ) 你只需要建立一個 php檔案,並且在上面寫下這幾句話,然後用個瀏覽器開啟它。
<?php
phpinfo () ;
?>
如果所有的擴充都被正確的安裝的話,你會找到一個項目叫 wsf,在一個以 wsf作為標題的表裡,你應當看到 'wsf support'之類的字樣。這個東東是在 php.ini裡定義的,(或者比如說我就沒有在 php.ini 裡面定義而是在 /etc/php5/conf.d/裡寫了一個新的檔案叫做 wsf.ini,實際上這個檔案夾裡面所有的檔案到後來都會被合并到 php.ini裡,所有如果你沒有在 php.ini裡找到相應的設定但是你的 wsf缺能用,你不妨來這裡看看。 )
如果這個擴這沒有顯示在 phpinfo裡,那麼你需要去找安裝指南來好好研究一下,如果找不到可以給我發 email: ferdinandfly@yahoo.ca
當你成功的安裝了以後,第二個問題就是你好像並不能讓這個例子正確運行。同樣的,你需要檢查一些設定是否正確。 首先是 php.ini記錄中,經常會設定一些記錄檔的路徑,也許他不存在或者是說他設定的路徑 php5無法讀寫。還有,你應到確認 php.ini是否包含了一些指令檔,而這些指令檔都是可讀的。
如果以上的這些都是正確的但是 wsf就是不幹活,你可以查看一下記錄檔。記錄檔會被寫到 wsf.log_path這條記錄所確定的路徑中。這個東東在 php.ini裡進行設定。如果他沒有被設定,那麼 log就在 /tmp裡( linux)。需要知道的是,在 windows平台中,預設的路徑很可能不存在,因此你必須為他指定一個日誌路徑。和服務有關的日誌記錄在 wsf_php_server.log中,和用戶端有關的儲存在 wsf_php_client.log中,如果你的客戶機和服務主機不是一台機器,那麼這兩個檔案都在伺服器上哦。你可以通過調節記錄的等級來獲得不同詳細程度的記錄檔。如果是調試,你可以把它設定為 level 4,當然如果是成熟的軟體,你可以設定為 0(僅僅是嚴重錯誤)或者是 1(錯誤)。
如果你想確認來往的交談內容( SOAP)是你所想要的格式的話,你可以用 SOAP 訊息跟蹤來調試,正如我們前面所講的。
總結:
在這篇文章中,我解釋了 WSMessage這個類以及怎樣處理交談內容並且使用它,用戶端或者服務端都可以通過調用 str這個 WSMessage的成員變數來獲得交談內容( xml)。通常交談內容的格式都是通過 WSDL來定義的,因此我們要求用戶端和服務端需要遵守同樣的格式是合理的。下一章我們會討論如何通過 WSO2 WSF/PHP和 WSDL協同工作 .