php有兩個擴展能夠實現web service,一個是NuSoap,一個是php 官方的soap擴展,因爲soap是官方的,因此咱們這裏以soap來實現web service.因爲默認是沒有打開soap擴展的,因此本身先看一下soap擴展有沒有打開。php
在soap編寫web service的過程當中主要用到了SoapClient,SoapServer,SoapFault三個類。
web
SoapClient類
這個類用來使用Web services。SoapClient類能夠做爲給定Web services的客戶端。
它有兩種操做形式:
* WSDL 模式
服務器
* Non-WSDL 模式函數
在WSDL模式中,構造器能夠使用WSDL文件名做爲參數,並從WSDL中提取服務所使用的信息。
ui
non-WSDL模式中使用參數來傳遞要使用的信息。code
SoapServer類
這個類能夠用來提供Web services。與SoapClient相似,SoapServer也有兩種操做模式:WSDL模式和non-WSDL模式。這兩種模式的意義跟 SoapClient的兩種模式同樣。在WSDL模式中,服務實現了WSDL提供的接口;在non-WSDL模式中,參數被用來管理服務的行爲。
在SoapServer類的衆多方法中,有三個方法比較重要。它們是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。
接口
下面給出實例:
定義一個提供服務的php類,這個類所提供的函數就是web service對外提供的服務get
<?php Class PersonInfo { /** * 返回姓名 * @return string * */ public function getName(){ return "My Name is Chance"; } } ?>
下面給出服務器端的代碼:
string
<?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(); ?>
下面是客戶端代碼:io
<?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(); } ?>