一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

使用php來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)服務(wù)

作者:samisa
以下文中的翻譯名稱對(duì)照表 :
payload: 交談內(nèi)容
object: 實(shí)例
function: 函數(shù)
使用 php來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)服務(wù)
使用框架: WSO2 WSF/php
安裝環(huán)境: windows 或者 linux
(厭惡于眼下計(jì)算機(jī)文章夾雜無(wú)數(shù)難懂的翻譯以及術(shù)語(yǔ),此處盡量使用口語(yǔ)以及漢語(yǔ)。)
WSMessages 類:
在調(diào)用網(wǎng)絡(luò)服務(wù)的過(guò)程中,需要兩個(gè)消息,發(fā)送的消息和接受的消息,又來(lái)有往方能來(lái)往不是。 WSMessages 這個(gè)類就是在 Web services framework for php (簡(jiǎn)稱 WSF)這個(gè)開(kāi)源框架中,用來(lái)封裝這兩個(gè)消息的類。
WSMessages 有一個(gè)很重要的變量 str來(lái)保存消息內(nèi)容,以 xml格式來(lái)保存“有效的載荷” (他們把這個(gè)叫做 payload,我查英文字典,就是這個(gè)意思,但是它來(lái)回的出現(xiàn),反復(fù)的出現(xiàn),今觀之,也就是交談內(nèi)容,實(shí)際上就是除去那些 xml的定義,以及一些其他的所謂‘命名空間' ->namespace的定義而已。要搞清楚什么是命名空間,請(qǐng)查看 xml的 W3C定義 )。有效載荷實(shí)在是莫名其妙,我以后還是用‘交談內(nèi)容'來(lái)指代它把。
如果你通過(guò)客戶程序發(fā)送一個(gè)請(qǐng)求,那么你需要構(gòu)造一個(gè) WSMessage 的實(shí)例,并且用 xml形式的交談內(nèi)容填寫(xiě)好這個(gè)實(shí)例。對(duì)應(yīng)請(qǐng)求的回應(yīng),也還是一個(gè)‘交談內(nèi)容'會(huì)通過(guò)你的程序返回,并且返回的東西也仍然是一個(gè) WSMessage 實(shí)例。
也就是說(shuō),你的客戶端函數(shù)掉應(yīng)一個(gè)網(wǎng)絡(luò)服務(wù),那么他的返回值也是一個(gè) WSMessage 實(shí)例。
你可以在一個(gè)函數(shù)中發(fā)送請(qǐng)求,調(diào)用網(wǎng)絡(luò)服務(wù)的程序,并且把返回內(nèi)容放在 WSMessage實(shí)例中,并且讓函數(shù)返回這個(gè) WSMessage實(shí)例。
WSMessage 更傾向于發(fā)送和接受比較復(fù)雜的內(nèi)容比如有附件什么的。下面就來(lái)詳細(xì)解釋一下如何使用 WSMessage 來(lái)實(shí)現(xiàn)客戶端和服務(wù)端的交流。
處理交談內(nèi)容:
在此之前已經(jīng)講解過(guò)如何使用 php來(lái)創(chuàng)建網(wǎng)絡(luò)服務(wù),并且已經(jīng)做了一個(gè)簡(jiǎn)單的客戶 -服務(wù)端程序來(lái)說(shuō)明工作流程。但是這些程序并沒(méi)有深入的解釋我們?cè)趺刺幚怼徽剝?nèi)容'。換句話來(lái)說(shuō),我們只是把 xml格式的交談內(nèi)容發(fā)送到了服務(wù)端,但并沒(méi)有想到去處理它。在這里,我們來(lái)詳細(xì)的解釋一下如何處理交談內(nèi)容并且把它用到計(jì)算程序中去。
交談內(nèi)容是一個(gè)商業(yè)邏輯定義的內(nèi)容,并且用 SOAP( Simple Object Access Protocol)來(lái)封裝的,(請(qǐng)參見(jiàn) SOAP w3c的文章)。讓我們用個(gè)例子來(lái)說(shuō)明如何計(jì)算一個(gè)階乘吧。
客戶端需要發(fā)送的交談內(nèi)容:
<getFactorial>
<param>6</param>
</getFactorial>
服務(wù)端需要明白這個(gè)交談內(nèi)容并且把變量分辨出來(lái)并且計(jì)算它的階乘。下面就是服務(wù)端程序:
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行,我們用輸入的‘交談內(nèi)容'創(chuàng)建了一個(gè) simpleXmlElement 的實(shí)例。你可以看到,輸入的交談內(nèi)容被保存到了通過(guò)函數(shù)參數(shù)傳遞進(jìn)來(lái)的 WSMessage 實(shí)例 $message的 str變量中。注: SimpleXml是一個(gè) php的擴(kuò)展,用于處理 xml文件或者字符串。 WSO2 WSF/php并沒(méi)有規(guī)定我們必須使用哪一個(gè) php擴(kuò)展來(lái)處理 xml。你可以使用你喜歡的人和 xml php 擴(kuò)展來(lái)處理,比如 domdocument, saxdom之類。
第 4行將交談內(nèi)容中的參數(shù)值提取出來(lái),這表示服務(wù)程序需要知道如何理解這些參數(shù),比如說(shuō)參數(shù)類型之類的東西。(正常來(lái)說(shuō)需要在交談內(nèi)容中說(shuō)明這個(gè)參數(shù)的類型)。函數(shù)中剩下的就是正常的處理階乘。在第六行,階乘通過(guò)調(diào)用其他函數(shù)被計(jì)算出來(lái)。從 8到 12行,回復(fù)的交談內(nèi)容也被寫(xiě)好并且準(zhǔn)被返回此內(nèi)容。第 14行我們返回回復(fù)的交談內(nèi)容。
回復(fù)的交談內(nèi)容應(yīng)該差不多是這樣的:
<getFactorialResponse>
<result>720</result>
</getFactorialResponse>
同樣的,客戶端也可以用同樣的方法處理回復(fù)的交談內(nèi)容:
$response = $client -> request ( $reqestPayloadString ) ;
$simplexml = new SimpleXMLElement ( $response -> str ) ;
echo "Result = " . $simplexml -> result [ 0 ] . "<br/>" ;
在第 3行,用回復(fù)的交談內(nèi)容創(chuàng)建了一個(gè) SimpleXMLElement 實(shí)例。同樣的 $response 也是一個(gè) WSMessage的實(shí)例,我們可以訪問(wèn)他的成員變量 str,這個(gè)變量保存了 xml格式的回復(fù)的交談內(nèi)容。我們把它交給一個(gè) SimpleXMLElement 構(gòu)造函數(shù),由此創(chuàng)建一個(gè) SimpleXMLElement的實(shí)例。然后我們就可以訪問(wèn)結(jié)果元素 (或者叫節(jié)點(diǎn)? element, xml里面可以稱之為元素,但對(duì)于樹(shù)狀結(jié)構(gòu)的它來(lái)說(shuō),節(jié)點(diǎn)也不為過(guò)? )
現(xiàn)在你應(yīng)該學(xué)會(huì)如何處理交談信息中的內(nèi)容,不管是客戶端的申請(qǐng)也好還是服務(wù)端的回應(yīng)也好。
注:在服務(wù)端的 getFactorial函數(shù) (14行 ),你可以之間返回一個(gè) WSmessage而不是一個(gè)回復(fù)的交談內(nèi)容。你可以用下面的這一小段程序來(lái)實(shí)現(xiàn)這個(gè)功能。
$outMessage = new WSMessage( $responsePayloadString );
return $outMessage ;
這其實(shí)也就是說(shuō)服務(wù)端程序及可以返回 xml格式的交談內(nèi)容也可以返回 WSMessage的實(shí)例
完整的程序?qū)⒃谶@篇文章的末尾附上。
跟蹤消息
通過(guò) WSO2 Web services framework for php ,你可以跟蹤 SOAP消息被客戶端發(fā)出,然后客戶端又收到了來(lái)自服務(wù)端的消息,(即他們的交談內(nèi)容)。網(wǎng)絡(luò)客戶服務(wù)類, WSClient 有兩個(gè)函數(shù)可以實(shí)現(xiàn)這個(gè)目的: getLastReauest()和 getLastResponse()。客戶端在使用 request()這個(gè)函數(shù)以后,你可以通過(guò)這兩個(gè)函數(shù)去得到交談信息。
$response = $client -> request ( $reqestPayloadString ) ;
printf ( "<br/> Request = %s </br>" ,
htmlspecialchars ( $client -> getLastRequest ())) ;
printf ( "<br/> Response = %s </br>" ,
htmlspecialchars ( $client -> getLastResponse ())) ;
以上的程序片段會(huì)顯示 request()這個(gè)函數(shù)實(shí)現(xiàn)的請(qǐng)求與回復(fù)的內(nèi)容。
實(shí)際上,這段程序差不多會(huì)輸出這樣的東西:
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消息對(duì)于研究呼叫的服務(wù)是非常有用的,特別是對(duì)于查找服務(wù)和客戶端的 bug。比如說(shuō),你可以確認(rèn)所有的客戶端發(fā)出的消息以及服務(wù)端回復(fù)的消息,并且,你可以確認(rèn)交談內(nèi)容的格式 (客戶端的以及服務(wù)端的。 )
Debugging(這個(gè)詞是如此的普遍,那么我在這里就不翻譯它了,盡管我的夢(mèng)想是有一天程序用中文來(lái)寫(xiě),顯而易見(jiàn)的是這個(gè)夢(mèng)已經(jīng)離我們?cè)絹?lái)越遙遠(yuǎn)。 )
用戶在使用 php WSF有時(shí)會(huì)碰到兩個(gè)問(wèn)題:
安裝 wsf。 你怎么能確定這個(gè) wsf已經(jīng)正常工作了?好吧,第一,你可以通過(guò) phpinfo()這個(gè)函數(shù)來(lái)檢查, (要是你不知道這個(gè)函數(shù)以及怎么使用它,呃,查查 php手冊(cè)吧。 ) 你只需要?jiǎng)?chuàng)建一個(gè) php文件,并且在上面寫(xiě)下這幾句話,然后用個(gè)瀏覽器打開(kāi)它。
<?php
phpinfo () ;
?>
如果所有的擴(kuò)展都被正確的安裝的話,你會(huì)找到一個(gè)項(xiàng)目叫 wsf,在一個(gè)以 wsf作為標(biāo)題的表里,你應(yīng)當(dāng)看到 'wsf support'之類的字樣。這個(gè)東東是在 php.ini里定義的,(或者比如說(shuō)我就沒(méi)有在 php.ini 里面定義而是在 /etc/php5/conf.d/里寫(xiě)了一個(gè)新的文件叫做 wsf.ini,實(shí)際上這個(gè)文件夾里面所有的文件到后來(lái)都會(huì)被合并到 php.ini里,所有如果你沒(méi)有在 php.ini里找到相應(yīng)的設(shè)置但是你的 wsf缺能用,你不妨來(lái)這里看看。 )
如果這個(gè)擴(kuò)這沒(méi)有顯示在 phpinfo里,那么你需要去找安裝指南來(lái)好好研究一下,如果找不到可以給我發(fā) email: ferdinandfly@yahoo.ca
當(dāng)你成功的安裝了以后,第二個(gè)問(wèn)題就是你好像并不能讓這個(gè)例子正確運(yùn)行。同樣的,你需要檢查一些設(shè)置是否正確。 首先是 php.ini記錄中,經(jīng)常會(huì)設(shè)置一些日志文件的路徑,也許他不存在或者是說(shuō)他設(shè)定的路徑 php5無(wú)法讀寫(xiě)。還有,你應(yīng)到確認(rèn) php.ini是否包含了一些腳本文件,而這些腳本文件都是可讀的。
如果以上的這些都是正確的但是 wsf就是不干活,你可以查看一下日志文件。日志文件會(huì)被寫(xiě)到 wsf.log_path這條記錄所確定的路徑中。這個(gè)東東在 php.ini里進(jìn)行設(shè)定。如果他沒(méi)有被設(shè)定,那么 log就在 /tmp里( linux)。需要知道的是,在 windows平臺(tái)中,默認(rèn)的路徑很可能不存在,因此你必須為他指定一個(gè)日志路徑。和服務(wù)有關(guān)的日志記錄在 wsf_php_server.log中,和客戶端有關(guān)的保存在 wsf_php_client.log中,如果你的客戶機(jī)和服務(wù)主機(jī)不是一臺(tái)機(jī)器,那么這兩個(gè)文件都在服務(wù)器上哦。你可以通過(guò)調(diào)節(jié)記錄的等級(jí)來(lái)獲得不同詳細(xì)程度的日志文件。如果是調(diào)試,你可以把它設(shè)置為 level 4,當(dāng)然如果是成熟的軟件,你可以設(shè)置為 0(僅僅是嚴(yán)重錯(cuò)誤)或者是 1(錯(cuò)誤)。
如果你想確認(rèn)來(lái)往的交談內(nèi)容( SOAP)是你所想要的格式的話,你可以用 SOAP 消息跟蹤來(lái)調(diào)試,正如我們前面所講的。
總結(jié):
在這篇文章中,我解釋了 WSMessage這個(gè)類以及怎樣處理交談內(nèi)容并且使用它,客戶端或者服務(wù)端都可以通過(guò)調(diào)用 str這個(gè) WSMessage的成員變量來(lái)獲得交談內(nèi)容( xml)。通常交談內(nèi)容的格式都是通過(guò) WSDL來(lái)定義的,因此我們要求客戶端和服務(wù)端需要遵守同樣的格式是合理的。下一章我們會(huì)討論如何通過(guò) WSO2 WSF/php和 WSDL協(xié)同工作 .

php技術(shù)使用php來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)服務(wù),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 天天舔 | 亚色在线观看 | 看全色黄大色黄大片 视 | 欧美成人丝袜一区二区 | 成人激情四射网 | 久久精品视频播放 | 国产色手机在线观看播放 | 精品国产一区二区三区香蕉事 | 亚洲国产网 | 亚洲欧美精品久久 | 久久久国产麻豆 | 国产美女又黄又爽又色视频网站 | 天天插伊人 | 国产激情视频 | 夜夜爽天天狠狠九月婷婷 | 在线视频免费国产成人 | 一区二区成人国产精品 | 成人精品一区二区激情 | 国产欧美在线观看精品一区二区 | 日韩中文一区 | 国产午夜精品福利久久 | 97夜夜澡人人双人人人喊女 | 好吊色在线视频 | www色在线| 亚洲小色网 | 999精品免费视频观看 | 精彩国产熟睡乱子伦午夜片 | 亚洲一区二区三区精品影院 | 精品福利一区二区免费视频 | 国产视频 一区二区 | 国产精品久久久久久久9999 | 91秒拍国产福利一区 | 99视频在线观看视频一区 | 在线观看视频www | 国产成人99久久亚洲综合精品 | 精品国产美女福利在线 | 一级毛片免费不卡 | 97超级碰久久久久香蕉人人 | 成人国产精品视频 | 久久精品综合网 | 国产精品视频一区二区猎奇 |