PHP基礎(十一)WEB Service

Web Service技術:
簡稱WS:WEB服務,是跨平臺並提供各項服務的一種技術。WS就是一個程序,它有一個能夠通過WEB進行調用的接口。通過調用這個接口,用戶可以實現某個功能的實現。
特點:實現“基於WEB的無縫集成”,
組成WS平臺的3個技術:
   SOAP(Simple Object Access Protocal)簡單對象訪問協議。
   WSDL(Services Description Language)WEB服務描述語言;
   UDDI(Universal Discovery Description Integration)通用發現,描述,集成。
SOAP協議:
SOAP是一種輕量級的協議,利用XML技術讓應用程序跨HTTP進行信息交換。可以和許多因特網協議結合使用。包括:HTTP,SMIP,MIME等等.
特點:SOAP的可擴展性
   SOAP可以在幾乎所有的傳輸協議上使用
   SOAP獨立於平臺,獨立於語言,允許任何編程模型,並且不依賴於RPC(?)。
   SOAP是基於XML技術的,所以它遵循XML標準。一個SOAP包就是一個XML文檔。
SOAP結構:
   <?xml version = "1.0" encoding = "gb2312"?>
   <!--Envelope 意思是:信封,封套。就是SOAP的最外層,即根元素。是SOAP必不可少的元素,結構如下:-->
   <soap:Envelope
   xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
   soap:encodingStyle="http://www.w3.org/2001/12/soap-envelope">
   <!-- 其中元素Envelope的命名空間的只必須是"http://www.w3.org/2001/12/soap-envelope"。否則此SOAP無效
   在SOAP Envelope中還有個屬性:encodingStyle.該屬性定義了文檔中的數據類型。該屬性可以在SOAP的任何一個元素中
   -->
   <!--
   Header元素包含了Envelope的一些專用信息,該元素是可選的。如果使用則必須是Envelope的第一個子元素。
   結構如下:
   -->
    <soap:Header>
     <tm:Info xmlns:tm="http://www.bocd.com/php"
     soao:mustUnderstand="1">Tsoft</tm:Info>
    </值等於0表示可選。soap:Header>
   <!--
   上面的代碼中,mustUnderstand是Header中的一個屬性,用於標識標題項對於要進行處理的接收者來說是否必須處  

理。值等於1表示必須處理;
   -->
   <!--
   SOAP Body是Envelope根元素中的必要元素。用於錯誤處理的Fault元素就屬於Body的子元素。它包含了SOAP的消息內容。
Fault元素用於保存SOAP中的錯誤信息及狀態信息;如有則它必須是Body的子元素。並且最多隻出現一次。Fault元素定義了以下4個子

元素:
<faultcode>:faultcode元素提供了故障代碼
<faultstring>:該元素提供了錯誤的解釋信息。類似與HTTP中的”Reason-Phrase“.
<faultactor>:該元素提供了導致錯誤發生的信息源
<detail>:該元素用來保存與Body元素有關的應用程序的錯誤信息。
如果Body元素的內容不能被成功的解析,則必須包含detail子元素。detail有一條編碼規則:一個detail由它的元素全名(包括命名空間)確定。
faultcode元素提供的故障代碼主要有4種:
   VersionMismatch:處理方發現SOAP封裝元素又不合法的命名空間。
   MustUnderstand:不能處理header子元素,因爲屬性mustUnderstand = 1不被理解。
   Client:表示信息的格式錯誤或包含不正確的信息。
   Server: 表示錯誤原因來自服務器。 
-->
   <soap:Body xmlns:tm="http://bccd.com/PHP">
    <tm:PHP_book>
     <tm:Name>PHP</tm:Name> 
    </tm:PHP_book>
   <soap:Body>
</soap:Envelope>
這個XML文檔主要由3部分組成。SOAP Envelope,SOAP Header和SOAP Body.此外,有一個Body的子元素:Fault。

WSDL文檔:
WSDL是用XML語言來描述WEB Service.通過WDSL,可以瞭解WEB Service提供了那些方法,使用的協議和服務器地址等。WSDL文檔主要由5部分元素組成。
結構:
<?xml version="1.0" encoding="gb2312"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"

xmlns:tm="http://localhost/wwwbccdnet" targetNamespace="http://localhost/wwwbccdnet">
<!--types定義WEB Service所用到的數據類型-->
<types>
   <xs:schema/>
</types>
<!--message包含了web service的所有信息 包括髮送的和接受的 傳入值用request 輸出值用response-->
<message name="getBccdRequest">
   <part name="user" type="xs:string"/>
</message>
<message name="getBccdResponse">
   <part name="return" type="xs:string"/>
</message>
<!--定義了web service可使用的方法及相關的信息-->
<portType name="getBccdPortType">
   <operation name="getBccd">
    <input message="tm:getBccdRequest"/>
    <output message="tm:getBccdResponse"/>
   </operation>
</portType>
<!--綁定portType描述service的接口和相關協議-->
<binding name="getBccdBinding" type="tm:getBccdPortType">
   <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
   <operation name="getBccd">
    <soap:operation soapAction="http://localhost/wwwbccdnet/getBccd"/>
    <input>
     <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    </input>
    <output>
     <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    </output>
   </operation>
</binding>
<!--用來確定portType的地址-->
<service name="getBccdService">
   <port name="getBccdPort" binding="tm:getBccdBinding">
    <soap:address location="http://localhost/tm/sl/25/1/server.php"/>
   </port>
</service>
</definitions>

PHP內置SOAP類庫:
使用SOAP類庫的步驟:首先對SOAP進行一些配置。使PHP支持SOAP函數;然後建立一個WSDL文檔;文檔創建成功後,最後使用SOAP類創建服務器和客戶端程序。
配置SOAP :
   在PHP中正確使用SOAP類庫,需對php.ini文件做如下改動
   1):去掉“;extension=php_soap.dll”前的“;”
   2):找到SOAP的配置部分,修改後的信息如下所示:
   [soap]
   ;Enables or disables WSDL caching feature,
   soap.wsdl_cache_enabled=0
   ;Sets the directory name where SOAP extension will put cache files.
   soap.wsdl_cache_dir="e:\windows\temp"
   ... 
其中,soap.wsdl_cache_enabled設爲0,意思爲關閉WSDL緩存;soap.wsdl_cache_dir爲緩存目錄。除此之外,再將參數

always_populate_raw_post_data設爲On,並去掉前面的分號,意思是允許威格士的post數據。重啓服務器,如果配置正確,在phpinfo()裏將能看到soap信息。
建立WSDL:
   創建服務器端頁面,創建流程:
    實現函數功能-->實例化對象-->添加接口函數-->調用對象句柄。
   例如:<?php
    //實現函數功能
    function getBccd($user){
     if(preg_match('/^[a-zA-Z_]\w*/',$user) == 0){
      return 'register fail.&nbsp;<a href=\'index.php\'>back</a>';
     }else{
      return 'Succeed!Welcome: '.$user;
     }
    }
    $server = new SoapServer('tmbccd.wsdl');//實例化對象
    $server->addFunction("getBccd");//添加接口。
    $server->handle();//調用對象句柄。
   ?>
   客戶端實際上就是通過服務器的接口函數來實現傳值的功能。頁面創建步驟:
    實例化對象-->調用接口函數-->輸出結果 
   例如:<?php
    $user = $_POST['user'];
    $client = new SoapClient("http://localhost/tm/sl/25/3/tmbccd.wsdl");//實例化對象
    $return = $client->getBccd($user);//調用接口函數
    echo $return;//輸出結果
    ?>
  http://localhost/tm/sl/25/3/tmbccd.wsdl:爲services的地址

使用NUSOAP類包:
NuSOAP是一個源代碼開放的SOAP類庫,第三方擴展包;下載解壓後會有兩個文件夾,將其中lib文件夾拷貝到服務器相應的目錄下就可以使用了。另一個sample文件夾是一些實例程序。
使用NuSOAP前先要在PHP.INI中將extension = php_soap.dll註釋掉(前面加上分號),因爲NuSOAP類庫的類名有衝突。重啓服務器即可使用。
NuSOAP類包主要包括三個類:soap_server,soapclient和soap_fault。
創建服務器端頁面:
   載入NuSOAP類-->實例化對象-->配置WSDL文檔-->註冊接口函數-->函數功能實現。還可以使用對象中的service方法來查看

WSDL文檔的內容和接口信息。
例如:<?php
   include ('../lib/nusoap.php');//載入NuSOAP類
   $server = new soap_server();//實例化對象
   $server->configureWSDL('myBccd');//配置WSDL文檔
   $server->register('getBccd',array('user'=>'xsd:string'),array('return'=>'xsd:string'));//註冊接口函數
   //函數功能實現
   function getBccd($user){
    return 'Succeed! '.$user. ', service is good.';
   }
   $server->service($HTTP_RAW_POST_DATA);
?>

創建客戶端頁面
   加載NuSOAP類-->實例化對象-->調用接口函數-->輸出返回信息。
例如: <?php
   include '../lib/nusoap.php';//加載類庫
   $client = new soapclient('http://localhost/tm/sl/25/2/server.php?wsdl',true);//實例化對象
   $return = $client->call('getBccd',array('user'=>'spcn'));//調用接口函數
   echo $return;//輸出返回信息
?>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章