PHP 中,在 php.ini 檔案中開啟了 php_soap.dll 擴充後,就可以支援 SOAP 了。
在soap擴充庫中,主要包括三種物件。
1、SoapServer
用於建立php伺服器端頁面時定義可被呼叫的函數及回傳回應資料。建立一個SoapServer物件的語法格式如下:
$soap = new SoapServer($wsdl, $array);
其中,$wsdl為shoap使用得wsdl文件,wsdl 是描述Web Service的一種標準格式, 其中,$wsdl為shoap使用得wsdl文件,wsdl 是描述Web Service的一種標準格式,其中若將$wsdl設定為null,則表示不使用wsdl模式。 $array是SoapServer的屬性訊息,是一個陣列。
SoapServer物件的addFunction方法是用來宣告哪個函數可以被客戶端調用,語法格式如下:
$soap->addFunction($function_name);
函數名。
SoapServer物件的handle方法用來處理使用者輸入並呼叫對應的函數,最後傳回給客戶端處理的結果。語法格式如下:
$soap->handle([$soap_request]);
其中,$soap是一個SoapServer物件,$soap_request是一個可選參數,用來表示使用者的請求資訊。如果不指定$soap_request,則表示伺服器將接收使用者的全部請求。
2、SoapCliet
用於呼叫遠端伺服器上的SoapServer頁面,並實作了對應函數的呼叫。建立一個SoapClient物件的語法格式如下:
$soap = new SoapClient($wsdl,$array);
其中,參數$wsdl和$array與SoapServer相同。
建立SoapClient物件後,呼叫服務端頁面中的函數相當於呼叫了SoapClient的方法,建立語法如下:
$soap->user_function($params);
,$soap->user_function($params);
要呼叫的函數,$params 是要傳入函數的參數。
3、SoapFault
SoapFault用於產生soap存取過程中可能出現的錯誤。建立一個soapFault物件的語法格式如下:
$fault = new SoapFault($faultcode,$faultstring);
其中,$faultcode是使用者定義的錯誤代碼,$faultstring是使用者自訂的錯誤訊息。 soapFault 物件會在伺服器端頁面發生錯誤時自動生成,或透過使用者自行建立SoapFault物件時生成。對於 Soap存取時發生的錯誤,用戶端可透過捕捉SoapFalut物件來獲得對應的錯誤訊息。
在客戶端捕獲SoapFault物件後,可以透過下面的程式碼取得錯誤代碼和錯誤訊息:
$fault->faultcode;//錯誤代碼
$fault->faultstring;//錯誤訊息前面建立的SoapFault物件。
不論是SoapServer還是SoapClient,都接收兩個參數,其中第二個參數是Option,它支援若干選項,這裡我們用到的有:
uri:命名空間,客戶端和服務端需要使用相同的命名空間
location:客戶端用,用來指定服務端程式的存取位址,也就是本例第二段程式碼的程式位址。
trace:客戶端用,為true時可以取得服務端與客戶端通訊的內容,以供調試。
Soapserver.php
Java程式碼
//先建立一個SoapServer物件實例,然後將我們要揭露的函數註冊,
/ap/p.
error_reporting(7); //正式發佈時,設為 0
date_default_timezone_set('PRC'); //設定時區 )
{
$retval = '';
if (strlen Fault ('Client', '', 'Invalid string');
}
for ($i = 1; $i
$retval .=$
return $retval;
}
function add2numbers($num1, $num2)
{
{
return new SoapFault ('Client', '', '第一個數字無效');
}
return new SoapFault('顧客端','','第二個數字無效'); } 回中($num1 + $num2);)
$time = date( 'Y-m-d H:i:s', time());
返回$時間;
}
} "));
$soap->addFunction('reverse');
$soap->addFunction('add2numbers');
$soap->addFunction('gettime); (SOAP_FUNCTIONS_ALL);
$soap->handle();
? >
SoapClient.php
Java 程式碼
error_reporting(7);
🠠p. location' => "http://www. yiigo.com/Soapserver.php", 'uri' =>"http://test -uri")); $str = 「此字串將被反轉」 ->reverse($str); echo 「如果你反轉'$str',你將會得到'$reversed'」;
$sum = $client->add2numbers($n1, $n2);
迴聲「
」;
迴聲「”;
echo 「remoye 系統時間是:」。 $client->gettime();
} catch (SoapFault $fault) {
echo 「故障!程式碼:」。 $故障->故障碼。 “ 細繩:” 。 $fault->faultstring;
}
? >
如果你反轉'這個字串將被反轉',你會得到'desrever eb lliw gnirts sihT'
如果你嘗試20 + 33,你會得到53remoye系統時間是:2012-05-28 16:14 :29
透過SoapHeader實現身分認證
Java程式碼
uth($a)
{
若($a!= '123456789 ') {
throw new SoapFault('伺服器', }
公用函數say()
{
} } $srv = new SoapServer(null, array('uri'h生活=> 'httpnew SoapServer(null, array('uri'h)> 'httpnew SoapServer(null, array('uri'h)> 'http
$srv->handle(); 客戶端Java代碼 $
array('uri' => 'http://localhost/namespace/',
'location' => true));
//auth為服務端要處理的函數 12345689為參數
$h = new SoapHeader , false, SOAP_ACTOR_NEXT);
$cli->__setSoapHeaders(array($h));
try {
echo $ echo $e->getMessage() ;
}
注意觀察server.php中的server類別有一個方法“auth”,剛好與header的名稱對應,方法auth的參數$u,就是soapHeader的data,soapServer接收到這個請求會,先調用auth方法,並將「123456789」當作參數傳遞給該方法。 mustUnderstand參數為false時,即便沒有auth這個方法,say方法也會被調用,但是如果它為true的話,如果auth方法不存在,就會返回一個Soapfault告知該header沒有被處理。 actor參數指名那些role必須處理該header,這兒我理解得不是太透徹,不好說。
Java代碼
$file = $this->getSoapWSDL();
$client = new SoapClient($file);//url可以透過瀏覽器來存取,不能直接呼叫瀏覽器userID' => 'test', 'merchantID' => 'test');
$returnSt = $client->checkUser($param); eck
public function getSoapWSDL() { //定期將url的檔案儲存到本地 $file = Mage::getBaseDir( . if (time() > filemtime($file) + 7 * 86400) { $url include_once(BP . DS . "lib/Snoopy.class.php"); $snoopy = new Snoopy; $snoopy->read_timeout = 4; $wsdl = $snoopy->results; if ($snoopy->status == '200' && !$ (!is_dir(dirname($file))) { mkdir(dirname ($file)); } } } return $file; }