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對外提供的服務
1 <?php
2 Class PersonInfo
3 {
4 /**
5 * 傳回姓名
6 * @return string
7 *
8 */
9 public function getName(){
10 return "My Name is Chance";
11 }
12 }
13 ?>
下面給出伺服器端的代碼:
2 //包含提供服務的類進來
3 require_once('PersonInfo.php');
4
5 //wsdl方式提供web service,如果生成了wsdl檔案則可直接傳遞到//SoapServer的構造函數中
6 //$s = new SoapServer('PersonInfo.wsdl');
7
8 //doesn't work 隻有location不能提供web service
9 //output:looks like we got no XML document
10 //$s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php"));
11
12 //下面兩種方式均可以工作,隻要指定了相應的uri
13 //$s = new SoapServer(null,array("uri"=>"Server.php"));
14 $s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php","uri"=>"Server.php"));
15
16 $s -> setClass("PersonInfo");
17
18 $s -> handle();
19 ?>
下面是用戶端代碼:
2 try{
3 //wsdl方式調用web service
4 //wsdl方式中由于wsdl檔案寫定了,如果發生添加删除函數等操作改動,不會反應到wsdl,相對non-wsdl方式
5 //來說不夠靈活
6 //$soap = new SoapClient("http://localhost/Test/MyService/PersonInfo.wsdl");
7
8 //non-wsdl方式調用web service
9 //在non-wsdl方式中option location系必須提供的,而服務端的location是選擇性的,可以不提供
10 $soap = new SoapClient(null,array('location'=>"http://localhost/Test/MyService/Server.php",'uri'=>'Server.php'));
11
12 //兩種調用方式,直接調用方法,和用__soapCall簡接調用
13 $result1 = $soap->getName();
14 $result2 = $soap->__soapCall("getName",array());
15 echo $result1."<br/>";
16 echo $result2;
17
18 }catch(SoapFault $e){
19 echo $e->getMessage();
20 }catch(Exception $e){
21 echo $e->getMessage();
22 }
23
24 ?>
如何聯系我:【萬裡虎】www.bravetiger.cn
【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/