利用php soap實現web service

轉載自http://www.cnblogs.com/chance1/archive/2009/04/08/1431949.html


今天學習到soap,偶遇到一介紹Soap的博文,Mark下。


php有兩個擴展可以實現web service,一個是NuSoap,一個是php 官方的soap擴展,由於soap是官方的,所以我們這裏以soap來實現web service.由於默認是沒有打開soap擴展的,所以自己先看一下soap擴展有沒有打開。


 在soap編寫web service的過程中主要用到了SoapClient,SoapServer,SoapFault三個類。


SoapClient類


這個類用來使用Web services。SoapClient類可以作爲給定Web services的客戶端。

它有兩種操作形式:


* WSDL 模式


* Non-WSDL 模式


在WSDL模式中,構造器可以使用WSDL文件名作爲參數,並從WSDL中提取服務所使用的信息。


non-WSDL模式中使用參數來傳遞要使用的信息。


SoapServer類


這個類可以用來提供Web services。與SoapClient類似,SoapServer也有兩種操作模式:WSDL模式和non-WSDL模式。這兩種模式的意義跟 SoapClient的兩種模式一樣。在WSDL模式中,服務實現了WSDL提供的接口;在non-WSDL模式中,參數被用來管理服務的行爲。


在SoapServer類的衆多方法中,有三個方法比較重要。它們是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。

下面給出實例:

定義一個提供服務的php類,這個類所提供的函數就是web service對外提供的服務

<?php
Class PersonInfo
{
    /**
     *    返回姓名
     *    @return string 
     *
     */
    public function getName(){
        return "My Name is Chance";
    }
}
?>

下面給出服務器端的代碼:

<?php
//包含提供服務的類進來
require_once('PersonInfo.php');

//wsdl方式提供web service,如果生成了wsdl文件則可直接傳遞到//SoapServer的構造函數中
//$s = new SoapServer('PersonInfo.wsdl');
//doesn't work 只有location不能提供web service
//output:looks like we got no XML document
//$s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php"));
 
//下面兩種方式均可以工作,只要指定了相應的uri
//$s = new SoapServer(null,array("uri"=>"Server.php"));
$s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php","uri"=>"Server.php"));

$s -> setClass("PersonInfo");

$s -> handle();
?>

下面是客戶端代碼:

 <?php
try{
	//wsdl方式調用web service
	//wsdl方式中由於wsdl文件寫定了,如果發生添加刪除函數等操作改動,不會反應到wsdl,相對non-wsdl方式
     //來說不夠靈活
      //$soap = new SoapClient("http://localhost/Test/MyService/PersonInfo.wsdl");
      
     //non-wsdl方式調用web service    
      //在non-wsdl方式中option location系必須提供的,而服務端的location是選擇性的,可以不提供
     $soap = new SoapClient(null,array('location'=>"http://localhost/Test/MyService/Server.php",'uri'=>'Server.php'));
     
     //兩種調用方式,直接調用方法,和用__soapCall簡接調用
     $result1 = $soap->getName();
     $result2 = $soap->__soapCall("getName",array());
     echo $result1."<br/>";
     echo $result2;
     
 }catch(SoapFault $e){
     echo $e->getMessage();
 }catch(Exception $e){
     echo $e->getMessage();
 }

?>



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