轉載自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();
}
?>