1. 程式人生 > >php中soap使用,SoapServer服務端編寫,SoapClient客戶端編寫

php中soap使用,SoapServer服務端編寫,SoapClient客戶端編寫


以前沒接觸過soap,最近要弄了,花了一天時間整理,學習了一下,轉載請註明http://blog.csdn.net/nanshan_hzq/article/details/52814622

一,首先要設定伺服器環境。
修改php.ini
得新增extension=php_soap.dll (載入soap 內建包)
修改soap.wsdl_cache_enabled=1 改為soap.wsdl_cache_enabled=0 這個是soap的快取,測試的時候最好改為0,上線穩定了改為1 soap有兩種模式一種是wsdl,一種是no-wsdl 二,熟悉幾個函式 1,SoapServer SoapServer用於建立php伺服器端頁面時定義可被呼叫的函式及返回 響應資料
格式:$soap = new SoapServer($wsdl,$array);
其中,$wsdl為soap使用得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,SoapClient SoapClient用於呼叫遠端伺服器上的SoapServer頁面,並實現了對相應函式的呼叫
格式:$soap = new SoapClient($wsdl,$array); 引數$wsdl和$array與SoapServer相同
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物件。
4,SoapHeader soapheader用於描述soap的header資訊,一般用於認證 /*  *SoapHeader引數說明如下所示:  *'MySoapHeader'          SoapHeader頭的類名  *'array(...)'            存放標識身份的字串引數  *'true'                  是否必須處理該header */ 格式:$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT); 三,例項 不用wsdl模式的程式碼 服務端:
//認證服務端
class Test{
public function auth($a)
{
if($a != '123456789'){
throw new SoapFault('Server', '您無權訪問');
}
}
function say()
{
return 'Hi11111';
}
}
$srv = new SoapServer(null, array('uri' => 'http://192.168.0.153/hao'));
$srv->setClass('Test');
$srv->handle();
Test類中auth是認證判斷的,這個方法對應客戶端soapheader中的方法 客戶端:
//加密的客戶端
$cli = new SoapClient(null, array('uri' => 'http://192.168.0.153/hao/', 'location' => 'http://192.168.0.153/hao/test.php', 'trace' => true,'encoding'=>'utf-8'));
$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);
$cli->__setSoapHeaders(array($h));
try {
echo $cli->say();
} catch (Exception $e) {
echo $e->getMessage();
}
soapheader中auth對應服務端auth方法 如果不 認證,可以去掉下面這兩行: $h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT); $cli->__setSoapHeaders(array($h)); wsdl模式 首先先生成wsdl檔案,至於怎麼生成網站很多 服務端:
//wsdl服務端
Require './server.class.php';
$server = new SoapServer('./server.wsdl');
$server->setClass('Server');
$server->handle();
server.class.php類程式碼
class Server {

public function auth($a){
if($a != '123456789'){
throw new SoapFault('Server', '您無權訪問');
}
}

public function test() {
return 'you are testing';
}

}

客戶端:
//wsdl檔案客戶端
$soap = new SoapClient('http://192.168.0.153/hao/server.wsdl'); //如果是遠端,那當然寫dizzylion.wsdl的URL了。
$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);
$soap->__setSoapHeaders(array($h));

try {
echo $soap->test();
} catch (Exception $e) {
echo $e->getMessage();
}