天天看點

PHP : SOAP 協定調用 Web服務(WebService)(轉)

原文位址: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 的公有方法。

繼續閱讀