PHP中SOAP協(xié)議的使用和相關(guān)調(diào)試
這次我們主要講解一下PHP的調(diào)試內(nèi)容,其中涉及了SOAP協(xié)議的使用。使用PHP中調(diào)用 WebService,聽上去有些高深莫測啊.其實這是很簡單的一件事.由于 Web服務(wù)完全是基于 XML 這種平臺無關(guān)性的標記語言來實現(xiàn)的,所以在 PHP中實現(xiàn)訪問 WebService 是可能的.本例我們來完成這樣一個 Web服務(wù)的調(diào)用:獲取手機號信息.在互聯(lián)網(wǎng)上找到這樣一個 Web服務(wù)是比較容易的,這里我為大家提供一個現(xiàn)成的:http://www.webxml.com.cn/zh_cn/web_services_item.aspx?id=776756327947797A706B413D.
該網(wǎng)站提供了一系列的 Web服務(wù),其中有收費的,也有可以免費使用的.在您打開上述網(wǎng)址后,將會列出"通訊和通信"分類下的所有可用 Web服務(wù).如果網(wǎng)站內(nèi)容沒發(fā)生改變,那么您在右側(cè)看到的第一條即為"國內(nèi)手機號碼歸屬地查詢WEB服務(wù)".每個 Web服務(wù)下面,包括了三項地址:EndPoint、Disco和 Wsdl.至于這三項各代碼什么含義,您可查詢相關(guān)資料.這里我們要用到的是 EndPoint 和 Wsdl.
通過 EndPoint 我們可以了解如何使用該服務(wù).打開 "EndPoint" 后面的地址:http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx.
在新打開的頁面中顯示出來該服務(wù)下所包括的方法.這個服務(wù)有兩個公有方法,分別是 getDatabaseInfo 獲得國內(nèi)手機號碼歸屬地數(shù)據(jù)庫信息 getMobileCodeInfo 獲得國內(nèi)手機號碼歸屬地省份、地區(qū)和手機卡類型信息.
并且,需要注意的是兩個方法的參數(shù)問題(如是否需要、需要幾個參數(shù))和它的返回結(jié)果.第一個方法 getDatabaseInfo 不需要參數(shù),返回的結(jié)果是一個一維數(shù)組;而第二個方法 getMobileCodeInfo 則需要兩個參數(shù):mobileCode 和 userID,在實際使用中,這兩個參數(shù)的值分別是需要查詢地區(qū)的手機號和空字符串(免費用戶),它返回結(jié)果是一個字符串.
而 Wsdl 這個地址,是我們在 php 程序中需要使用的地址,現(xiàn)在返回對 PHP 的介紹.
在目前的 PHP5 中,已經(jīng)提供了對 SOAP協(xié)議的支持(至于 SOAP協(xié)議的解釋,您可查詢相關(guān)資料了解),它作為一種擴展存在于 PHP 中.在默認情況下,這個擴展是沒有被開啟的.開啟該擴展的方法:打開 PHP.ini 文件,找到 ;extension=php_soap.dll 一行,將其前面的注釋符";"去掉,保存并重啟 Apache 服務(wù).現(xiàn)在開始代碼編寫,頁面代碼如下:
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style type="text/css">
- body{font-size:12px;}
- </style>
- </head>
- <body>
- <!-- 這里我隨意指定一個手機號碼,在下面的 PHP 代碼中它會作為參數(shù)的一部分 -->
- <h1>A phone No: 13973738080</h1>
- <?php
- //這里是該服務(wù)的 WSDL 地址
- $wsdl="http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
- //實例化 Soap Client,即 Soap協(xié)議的客戶端
- $client=new Soap Client($wsdl);
- //使用 getMobileCodeInfo 方法,需要傳遞兩次參數(shù),需要注意的是,這兩個參數(shù)須放到一個數(shù)組中
- $onePhone=$client->getMobileCodeInfo(
- array('mobileCode'=>'13973738080',
- 'userID'=>''
- )
- );
- //顯示返回信息
- print_r($onePhone);
- ?>
- <hr />
- <h1>All Information</h1>
- <?php
- //調(diào)用另外一個方法,該方法不需要參數(shù)
- $result=$client->getDatabaseInfo();
- //顯示其返回結(jié)果
- print_r($result);
- ?>
- </body>
運行結(jié)果,如下圖:
看起來是很簡單吧,是的,就這么簡單.由于代碼中給出了比較詳細的注釋,所以就不再作過多解釋,但仍需要向讀者說明以下幾個問題:
1. SoapClient 是存在于 Soap.dll 擴展中的一個對象,用來"扮演" Soap協(xié)議的訪問過程中的客戶端,并為其提供相關(guān)功能.相應(yīng)的,該擴展中同樣存在一個用于提供(或創(chuàng)建) Web服務(wù)的 Soap協(xié)議服務(wù)端,它的任務(wù)由 Soap Server 來完成.至于 Soap Server 對象,我將在后續(xù)的講解中來說明它的用法.
2. Soap Client 的實例化:它的構(gòu)造函數(shù)包括兩處參數(shù),一個是 WSDL 文件(即 WSDL 地址),一個是選項列表,后面這個參數(shù)是可選的,它用來完成更復(fù)雜的訪問,如使用代理訪問,或者提供服務(wù)器需要驗證的用戶名和密碼,等等.這里不再詳述,讀者可參考相關(guān)資料.
3. Soap Client 實例化之后,就可以通過該實例化對象來調(diào)用該 WebService 的公有方法.
如果您對本文中介紹的方法有何意見或建議,請留下您的高見,歡迎交流.本文由 NBWD 原創(chuàng),請放心轉(zhuǎn)載.