原文位址:http://blog.sina.com.cn/s/blog_441c62380100nada.html
使用 PHP 中調用 WebService,聽上去有些高深莫測啊。
其實這是很簡單的一件事。由于Web服務完全是基于 XML 這種平台無關性的标記語言來實作的,是以在 PHP中實作通路 WebService是可能的。本例我們來完成這樣一個 Web服務的調用:擷取手機号資訊。在網際網路上找到這樣一個Web服務是比較容易的,這裡我為大家提供一個現成的:http://www.webxml.com.cn/zh_cn/web_services_item.aspx?id=776756327947797A706B413D。
該網站提供了一系列的Web服務,其中有收費的,也有可以免費使用的。在您打開上述網址後,将會列出“通訊和通信”分類下的所有可用Web服務。如果網站内容沒發生改變,那麼您在右側看到的第一條即為“國内手機号碼歸屬地查詢WEB服務”。每個Web服務下面,包括了三項位址:EndPoint、Disco和Wsdl。至于這三項各代碼什麼含義,您可查詢相關資料。這裡我們要用到的是 EndPoint 和 Wsdl。
通過 EndPoint我們可以了解如何使用該服務。打開 "EndPoint" 後面的位址:http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx。
在新打開的頁面中顯示出來該服務下所包括的方法。這個服務有兩個公有方法,分别是 getDatabaseInfo獲得國内手機号碼歸屬地資料庫資訊 getMobileCodeInfo 獲得國内手機号碼歸屬地省份、地區和手機卡類型資訊。
并且,需要注意的是兩個方法的參數問題(如是否需要、需要幾個參數)和它的傳回結果。第一個方法 getDatabaseInfo不需要參數,傳回的結果是一個一維數組;而第二個方法 getMobileCodeInfo 則需要兩個參數:mobileCode 和userID,在實際使用中,這兩個參數的值分别是需要查詢地區的手機号和空字元串(免費使用者),它傳回結果是一個字元串。
而 Wsdl 這個位址(http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl),是我們在 php程式中需要使用的位址,現在傳回對 PHP 的介紹。
在目前的 PHP5 中,已經提供了對SOAP 協定的支援(至于 SOAP 協定的解釋,您可查詢相關資料了解),它作為一種擴充存在于 PHP中。在預設情況下,這個擴充是沒有被開啟的。開啟該擴充的方法:打開 PHP.ini 檔案,找到 ;extension=php_soap.dll一行,将其前面的注釋符“;”去掉,儲存并重新開機Apache 服務。現在開始代碼編寫,頁面代碼如下:
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<style type="text/css">
body{font-size:12px;}
</style>
</head>
<body>
<!-- 這裡我随意指定一個手機号碼,在下面的 PHP代碼中它會作為參數的一部分 -->
<h1>A phone No:13973738080</h1>
<?php
//這裡是該服務的 WSDL 位址
$wsdl="http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
//執行個體化 SoapClient,即 Soap 用戶端
$client=new SoapClient($wsdl);
//使用 getMobileCodeInfo方法,需要傳遞兩次參數,需要注意的是,這兩個參數須放到一個數組中
$onePhone=$client->getMobileCodeInfo(
array('mobileCode'=>'13973738080',
'userID'=>''
)
);
//顯示傳回資訊
print_r($onePhone);
?>
<hr />
<h1>AllInformation</h1>
<?php
//調用另外一個方法,該方法不需要參數
$result=$client->getDatabaseInfo();
//顯示其傳回結果
print_r($result);
?>
</body>
圖省略...
看起來是很簡單吧,是的,就這麼簡單。由于代碼中給出了比較詳細的注釋,是以就不再作過多解釋,但仍需要向讀者說明以下幾個問題:
1. SoapClient 是存在于Soap.dll 擴充中的一個對象,用來“扮演” Soap通路過程中的用戶端,并為其提供相關功能。相應的,該擴充中同樣存在一個用于提供(或建立) Web服務的 Soap 服務端,它的任務由SoapServer 來完成。至于 SoapServer 對象,我将在後續的講解中來說明它的用法。
2. SoapClient的執行個體化:它的構造函數包括兩處參數,一個是 WSDL 檔案(即 WSDL位址),一個是選項清單,後面這個參數是可選的,它用來完成更複雜的通路,如使用代理通路,或者提供伺服器需要驗證的使用者名和密碼,等等。這裡不再詳述,讀者可參考相關資料。
3. SoapClient執行個體化之後,就可以通過該執行個體化對象來調用該 WebService 的公有方法。