PHP基於SOAP實現webservice

    簡單對象訪問協議(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;

}
相關文章
相關標籤/搜索