簡單對象訪問協議(SOAP)是一種輕量的、簡單的、基於 XML 的協議,它被設計成在 WEB 上交換結構化的和固化的信息。 SOAP 能夠和現存的許多因特網協議和格式結合使用,包括超文本傳輸協議( HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME)。它還支持從消息系統到遠程過程調用(RPC)等大量的應用程序。php
PHP有兩個擴展能夠實現web service,一個是NuSoap,一個是php官方的soap擴展,因爲soap是官方的,因此咱們這裏以soap來實現web service。因爲默認是沒有打開soap擴展的,因此本身先看一下soap擴展有沒有打開。html
在soap編寫web service的過程當中主要用到了SoapServer,SoapClient,SoapFault三個類:web
1、SoapServer類
1.這個類能夠用來提供Web services。SoapServer有兩種操做模式:數據庫
* WSDL 模式:構造器可使用WSDL文件名做爲參數,並從WSDL文件中提取服務所使用的信息(使用Zend Studio可生成wsdl文件)。
* Non-WSDL 模式:使用參數來傳遞要使用的信息(本文就以此模式演示)。數組
在WSDL模式中,服務實現了WSDL提供的接口;在non-WSDL模式中,參數被用來管理服務的行爲。服務器
2.$soapServer = new SoapServer( mixed $wsdl [, array $options ]);
參數1: $wsdl 若是使用wsdl模式就給值爲wsdl文件所在URI路徑,不然如不使用wsdl模式就給值null,在第2個參數$options中給服務器傳遞對應值;
參數2: $options 此參數爲數組類型,能夠設置如:版本、編碼及URI等參數。
如: array('soap_version' => SOAP_1_2, 'actor' =>'http://example.org/ts-tests/C', 'encoding'=>'utf8','location'=>'http://test-uri/url', 'uri' => 'http://test-uri/')
一般給出uri參數便可,uri參數表明命名空間,客戶端location必須提供,而服務端的location是選擇性的,能夠不提供;cookie
可用方法函數列表:
1 __construct
做用:建立 SoapServer 對象
用法:__construct ( mixed wsdl [, array options] )
參數:wsdl 文件地址,options soap_version,encoding,actor,classmap
返回:對象session
2 addFunction
做用:爲客戶端導出一個或多個函數
用法:addFunction ( mixed functions )
參數:functions 函數,一個或多個,所有 SOAP_FUNCTIONS_ALL
返回:無併發
3 getFunctions
做用:獲取所有函數
用法:getFunctions ()
參數:無
返回:函數數組函數
4 setClass
做用:導出類中的所有函數
用法:setClass ( string class_name [, mixed args [, mixed ...]] )
參數:class_name 類名 args 參數
返回:無
5 setPersistence
做用:容許保存在PHP之間的會話(SESSION)請求數據
用法:setPersistence ( int mode )
參數:mode SOAP_PERSISTENCE_SESSION SOAP_PERSISTENCE_REQUEST
返回:無
6 fault
做用:出錯處理方法
用法:fault ( string code, string string [, string actor [, mixed details [, string name]]] )
參數:code 錯誤代碼 string 簡短錯誤信息 actor 致使錯誤的字符串 details 錯誤詳細信息
返回:無
7 handle ( [string soap_request] )
做用:處理一個SOAP請求,調用必要的功能,併發送回一個響應。
用法:handle ( [string soap_request] )
參數:soap_request 請求
返回:無
在SoapServer類的衆多方法中,有三個方法比較重要。它們是: SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。
3.兩種模式的使用示例:
WSDL 模式: $soapServer = new SoapServer('http://example.com/xxx/someName.wsdl',array('uri' => 'http://test-uri/'));
Non-WSDL 模式: $soapServer = new SoapServer(null,array('uri' => 'http://test-uri/'));
SoapServer類方法:
$soapServer>setClass('{你的類名}'); //註冊class
$soapServer>addFunction('{你的函數名}'); //添加自定義函數
$soapServer>addFunction(SOAP_FUNCTIONS_ALL); //添加當前主機環境配置的全部PHP可用函數(主要應用於跨語言調用時,使對方語言也可以使用PHP函數)
$soapServer>handle(); //處理一個SOAP請求,調用必要的功能,併發送回一個響應
注:setClass() 與 addFunction() 不可同時使用,不知道爲何~~~~
2、SoapClient類
1.這個類也是有對應的兩種操做形式:
* WSDL 模式
* Non-WSDL 模式
2.$soapClient = new SoapClient( mixed $wsdl [, array $options ]);
參數1,解釋同上,略.....
參數1,一般給出location和uri參數便可,uri參數表明命名空間,客戶端location必須提供,而服務端的location是選擇性的,能夠不提供;
location表明SoapServer的php文件的URL位置;
可用方法函數列表:
1 __construct
做用:建立 SoapClient 對象
用法:__construct ( mixed wsdl [, array options] )
參數:wsdl 文件地址 或 null,
options
a、soap_version soap版本,encoding 編碼,compression 壓縮,classmap
b、http身份驗證 :login , password
c、代理服務:proxy_host, proxy_port, proxy_login and proxy_password
d、證書驗證:local_cert , passphrase
e、wsdl 爲null 時:location , uri
返回:對象
2 __call
做用:調用函數
用法:__call ( string function_name, array arguments [, array options [, array input_headers [, array output_headers]]] )
參數:function_name,arguments
返回:無
3 __doRequest
做用:在執行HTTP請求
用法:__doRequest ( string request, string location, string action, int version [, int one_way] )
參數:request XML的SOAP請求 location 請求地址 action ,version
返回:字符串
4 __getFunctions
做用:獲取所有方法
用法:__getFunctions()
參數:無
返回:函數數組
5 __setCookie
做用:設置cookie
用法:__setCookie ( string name [, string value] )
參數:name cookie名稱 value cookie值
返回:無
6 __getLastRequest
做用:獲取最後的請求
用法:__getLastRequest ()
參數:無
返回:最後的請求
7 __getLastRequestHeaders
做用:獲取最後的請求頭部信息
用法:__getLastRequestHeaders ()
參數:無
返回:最後的請求頭部信息
8 __getLastResponse
做用:獲取最後的迴應
用法:__getLastRequest ()
參數:無
返回:最後的請求迴應
9 __getLastResponseHeaders
做用:獲取最後的迴應頭部信息
用法:__getLastResponseHeaders ()
參數:無
返回:最後的迴應頭部信息
3.兩種模式的使用示例:
WSDL 模式: $soapClient = new SoapClient('http://example.com/xxx/someName.wsdl',array('encoding'=>'utf8'));
Non-WSDL 模式: $soapClient = new SoapClient(null,array('location'=>'http://test-uri/url','uri' => 'http://test-uri/'));
3、SoapFault類是出錯處理類
參考文檔: http://blog.csdn.net/binyao02123202/article/details/5681445
http://blog.csdn.net/binyao02123202/article/details/5681500
4、demo示例
<?php //server端 session_start(); $uri = '127.0.0.1'; $soapServer=new SoapServer(null,array('uri'=>$uri)); $soapServer->setClass('Persion'); //註冊class $soapServer->handle(); //發送應答,處理SOAP請求 /** * 定義一個名稱Persion的類 * @param 無 * @return 無 * @author martinzhang */ class Persion{ public $name = '張三'; public function __construct(){ } /** * 獲取名稱 * @param 無 * @return 返回當前name * @author martinzhang */ public function getName(){ return $this->name; } /** * 接收客戶端傳遞來的數據,並寫入服務器文件或數據庫 * @param setname 客戶端傳遞來的名字 * @return int 寫入文件的字節數 * @author martinzhang */ public function putName($putname){ return file_put_contents('./namelist.txt',$putname,FILE_APPEND); //追加寫入 } /** * 透傳PHP內置函數 - strlen() * @param string 待檢查的字符串 * @return int 返回字符串長度 * @author martinzhang */ public function soapStrlen($string){ return strlen($string); } }
<?php //client端 header('Content-Type:text/html;charset=UTF-8'); $location = 'http://others.com/0_module/0/PHP/webservice/class_serverSoap.php'; $uri = '127.0.0.1'; try{ $soapClient = new SoapClient(null,array('location'=>$location,'uri'=>$uri)); echo $soapClient->getName(); echo '<br />'; echo $soapClient->putName("lisiwangwu\n"); echo '<br />'; echo $soapClient->soapStrlen('abcd'); //至關於使用了strlen()函數 echo '<br />'; }catch(SoapFault $fault){ echo 'Error:'.$fault->faultcode.',String:'.$fault->faultstring; }