SOAP,英文是「肥皂」的意思。但就是這個玩意在很大程度上影響了互聯網世界,前幾年瘋炒“Web服務”概念之後,SOAP就是其成就或者說“遺產”,因為 SOAP 就是迎來實現 Web 服務的。
SOAP = Simple Object Access Protocol,簡單物件存取協定。它是一種輕量的、簡單的、基於 XML 的協議,它被設計成在 WEB 上交換結構化的和固化的資訊。 SOAP 可以和現存的許多因特網協定和格式結合使用,包括超文本傳輸協定( HTTP),簡單郵件傳輸協定(SMTP),多用途網際郵件擴充協定(MIME)。它還支援從訊息系統到遠端過程呼叫(RPC)等大量的應用程式。
透過 SOAP 協定實現的 Web 服務,讓全世界的程式設計師所寫的類別、函數可以集合起來,建成一個龐大的函數庫,而且是語言無關的。這為軟體事業描繪了一個燦爛的發展前景,只要網路連在一起,就可以實現代碼級的邏輯共享,過去的跨進程、跨機器、跨網絡的通信問題全部都解決了,而且 http
協定是能夠穿越防火牆的(其實是防火牆一般不封鎖http協定的80端口,否則誰也別上互聯網)。
難怪很多人都非常看好這項技術,稱其為「激動人心」。而 Web 服務實作起來又很簡單,可以簡單的基於現在網路上無數的 Web 平台來發佈。簡單的往往是最美的,Web服務就是一個現實的例子。
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為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物件。
範例:
檔案 soapfunc.php:
/* 幾個供client端呼叫的函數*/
functionverse($str); if(strlen($str) {
return new SoapFault('Client','','無效字串');
$retval .= $str[(strlen($str)-$i)];
}
return $retval;
}
($num1) != intval( $num1))
{
return new SoapFault('客戶端','','第一個數字無效');
{
return new SoapFault('Client','','第二個數字無效');
}
return ($num1+$num2);
'Y-m-d H: i :s',time());
return $time;
}
}
?>
然後將我們傳入的函數註冊,
//最後的handle()用來處理接受的soap請求
include_once('soapfunc.php');
); //設定時區
$soap = new SoapServer(null, array('uri'=>"httr://test-rui"));
$soap->addFunction('reverse'); add2numbers');
$soap->addFunction('gettime');
$soap->addFunction(SOAP_FUNCTIONS_ALL)); client .php 內容:
error_reporting (7);
try
{
$client = new SoapClient(null, array('lobcation'=>"http://localhost:8050/_my //test-uri"));
$str="此字串將被反轉";
$reversed = $client->reverse($str);會得到'$reversed'";
$n1 = 20;
$n2 = 33;
cho "
";
echo "如果你試$n1 + $n2, 你會得到$sum";
echo "
";
echo "remoye ault)
{
echo "故障!代碼:" . $fault->faultcode . “ 細繩:” 。 $fault->faultstring;
}
?>
PHPMang) 對服務透過WSDL Web 對服務的發布。於描述Web服務的語法規範,針對每個Web服務來說起來,它是一個說明文檔,對web服務的位置、協定和介面進行了詳細的說明。包括5部分:類型、訊息、連接埠類型、綁定和服務五部分。
1 Types定義: 類型定義,獨立於語言.對應於SOAP訊息中要傳送的元素資訊的定義
2 Message: 每個web方法對應兩個message定義in和out.而message的定義包含了頭和體
3 PortType: 每個web service對應一個PortType,該PortType中又包含了對其發布的方法, operation(操作)
4 Bindings: 指定每porttype中每個操作(類別以及方法)的綁定資訊,包含input和output的訊息的格式.
5 Service: 每個web service綁定的port資訊
Web 服務除過按照前述的範例形式發布外,還可以透過WSDL 文件來發布。
範例:
要發佈的類,檔案myservice.php:
class service
{
public function HelloWorld()
{
return "Hello"; b)
{
return $a+$b;
}
}
$server=new SoapServer('TestSoap.wsdl',array('soap_version' => SOAP_1_2));
$server->handle();
?>
WSDL 描述文檔,文件TestSoap.wsdl:
呼叫程式碼,Client .php:
error_reporting(7);
$client = new SoapClient("http://localhost:8080/_myPHP5/soap/Wsdl/TestSoap.wsdl");
echo $cliclient->Hello(); echo("
");
echo $client->Add(10, 20);
?>
#0 [internal function]: SoapClient->__call('test', Array)
#1 D:xampphtdocsclien. php(5): SoapClient->test()
#2 {main}
ini_set("soap.wsdl_cache_enabled", "0");
2、如果偵錯時報告不識別xml錯誤,請確保程式碼裡沒有空格等無關訊息,例如 Utf-8 編碼檔案的 BOM 頭。
來自「網眼視界」:http://blog.why100000.com
作者微博:http://t.qq.com/ zhangking
「十萬個為什麼」電腦學習網:http://www.why100000.com