SOAP,英文是“肥皂”的意思。但就是這個玩意在很大程度上影響了互連網世界,前幾年瘋炒“Web服務”概念之後,SOAP就是其成就或者說“遺產”,因為 SOAP 就是迎來實現 Web 服務的。
SOAP = Simple Object Access Protocol,簡易物件存取通訊協定 (SOAP)。它是一種輕量的、簡單的、基於 XML 的協議,它被設計成在 WEB 上交換結構化的和固化的資訊。 SOAP 可以和現存的許多網際網路協議和格式結合使用,包括超文字傳輸通訊協定 (HTTP)( 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設定為null,則表示不使用wsdl模式。$array是SoapServer的屬性資訊,是一個數組。
SoapServer對象的addFunction方法是用來聲明哪個函數可以被用戶端調用,文法格式如下:
$soap->addFunction($function_name);
其中,$soap是一個SoapServer對象,$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是一個SoapClient對象,user_function是伺服器端要調用的函數,$params 是要傳入函數的參數。
3、SoapFault
SoapFault用於產生soap訪問過程中可能出現的錯誤。建立一個soapFault對象的文法格式如下:
$fault = new SoapFault($faultcode,$faultstring);
其中,$faultcode是使用者定義的錯誤碼,$faultstring是使用者自訂的錯誤資訊。soapFault 對象會在伺服器端頁面出現錯誤時自動產生,或者通過使用者自行建立SoapFault對象時產生。對於 Soap訪問時出現的錯誤,用戶端可通過捕捉SoapFalut對象來獲得相應的錯誤資訊。
在用戶端捕獲SoapFault對象後,可以通過下面的代碼獲得錯誤碼和錯誤資訊:
$fault->faultcode;//錯誤碼
$fault->faultstring;//錯誤資訊
其中,$fault是在前面建立的SoapFault對象。
樣本:
檔案 soapfunc.php:
/* 幾個供client端調用的函數 */
function reverse($str)
{
$retval='';
if(strlen($str)<1)
{
return new SoapFault('Client','','Invalid string');
}
for($i=1; $i<=strlen($str); $i++)
{
$retval .= $str[(strlen($str)-$i)];
}
return $retval;
}
function add2numbers($num1, $num2)
{
if(trim($num1) != intval($num1))
{
return new SoapFault('Client','','The first number is invalid');
}
if(trim($num2) != intval($num2))
{
return new SoapFault('Client','','The second number is invalid');
}
return ($num1+$num2);
}
function gettime()
{
$time = date('Y-m-d H:i:s',time());
return $time;
}
?>
檔案 soapclsoapserverient.php 內容:
//先建立一個SoapServer對象執行個體,然後將我們要暴露的函數註冊,
//最後的handle()用來處理接受的soap請求
include_once('soapfunc.php');
error_reporting(7); //正式發布時,設為 0
date_default_timezone_set('PRC'); //設定時區
$soap = new SoapServer(null, array('uri'=>"httr://test-rui"));
$soap->addFunction('reverse');
$soap->addFunction('add2numbers');
$soap->addFunction('gettime');
$soap->addFunction(SOAP_FUNCTIONS_ALL);
$soap->handle();
?>
檔案 soapclient.php 內容:
error_reporting(7);
try
{
$client = new SoapClient(null, array('location'=>"http://localhost:8080/_myPHP5/soap/soapserver.php", 'uri'=>"http://test-uri"));
$str="This string will be reversed";
$reversed = $client->reverse($str);
echo "if you reverse '$str', you will get '$reversed'";
$n1 = 20;
$n2 = 33;
$sum = $client->add2numbers($n1,$n2);
echo "
";
echo "if you try $n1 + $n2, you will get $sum";
echo "
";
echo "The remoye system time is: ".$client->gettime();
}
catch(SoapFault $fault)
{
echo "Fault! code:" . $fault->faultcode . " string:" . $fault->faultstring;
}
?>
PHP 中還實現了通過 WSDL 對 Web 服務的發布。
WSDL 是一種用於描述Web服務的文法規範,針對每個Web服務來說,它是一個說明文檔,對web服務的位置,協議和介面進行詳細的說明.由web服務的開發人員提供。
WSDL檔案包括5部分:types, Message,PortType,Binding和Service五部分.
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";
}
public function Add($a,$b)
{
return $a+$b;
}
}
$server=new SoapServer('TestSoap.wsdl',array('soap_version' => SOAP_1_2));
$server->setClass("service");
$server->handle();
?>
WSDL 描述文檔,檔案 TestSoap.wsdl:
targetNamespace="urn:TestSoap"
xmlns:typens="urn:TestSoap"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
調用代碼,檔案 Client.php:
error_reporting(7);
$client = new SoapClient("http://localhost:8080/_myPHP5/soap/Wsdl/TestSoap.wsdl");
echo $client->HelloWorld();
echo("
");
echo $client->Add(10, 20);
?>
然而,WSDL 文檔的編寫是一件很麻煩的事情,無聊又容易出錯。很多人認為那玩意兒不是人寫的,但是,如果有好的軟體工具,那玩意兒又是不需要人寫的。Zend 公司的 ZED 5.0 系列和 Zend Studio for eclipse 6.0 原來是很好支援 WDSL 的可視化編輯和類的發布的(按照一個類檔案智能產生),但 Zend studio 7.0 之後,這方面功能有所減弱。但基於 Eclipse 構建的 Zend studio 7.x,還是有一個 WSDL 的可視化編輯器,功能也還夠用,產生的 WSDL 檔案與以前有細微的變化。需要程式員必須對 WSDL 文檔裡的標籤和元素很熟悉。
附錄:關於 PHP 開發 Soap 的一些錯誤
1、開發的時候一定要關閉 php soap 的緩衝,伺服器和用戶端都需要,不然會報:
Fatal error: Uncaught SoapFault exception: [Client] Function (”test”) is not a valid method for this service in ……\clien.php:5 Stack trace:
#0 [internal function]: SoapClient->__call(’test’, Array)
#1 D:\xampp\htdocs\clien.php(5): SoapClient->test()
#2 {main}
關閉方法:
ini_set("soap.wsdl_cache_enabled", "0");
可以通過類似 $client->__getFunctions() 等方法查看 Soap 的一些資訊。
2、如果調試時報告不識別xml錯誤,請確保代碼裡沒有空格等無關資訊,比如 Utf-8 編碼檔案的 BOM 頭。
作者:張慶(網眼) 西安 PHP 教育培訓中心 2010-7-11
來自“網眼視界”:http://blog.why100000.com
作者微博:http://t.qq.com/zhangking
“十萬個為什麼”電腦學習網:http://www.why100000.com
以上就介紹了PHP 中使用 SOAP,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。