PHP寫webservice服務端,webservice服務端
1) WebService技術介紹
WebService是一種跨程式設計語言和跨作業系統平台的遠程調用技術。只有通過Web Service,用戶端和伺服器才能夠自由的用HTTP進行通訊,不論兩個程式的平台和變成語言是什麼。
XML、SOAP和WSDL是Web Service平台的三大技術:
WebService採用HTTP協議傳輸資料,採用XML格式封裝資料,即XML中說明調用遠程服務物件的哪個方法、傳遞的參數是什麼、以及服務物件的返回結果是什麼。XML是WebService平台中表示資料的格式,除了易於建立和易於分析外,XML主要的有點在於它既是平台無關的,又是廠商無關的。
SOAP,WebService通過HTTP協議發送請求和接收結果時,發送的請求內容和結果內容都採用XML格式封裝,並增加了一些特定的HTTP訊息頭,以說明HTTP訊息的內容格式,這些特定的HTTP訊息頭和XML內容格式就是SOAP協議,SOAP提供了標準的RPC方法來調用Web Service。SOAP協議 = HTTP協議 + XML資料格式。
WSDL(Web Service Description Language)是基於XML的語言,用於描述Web Service及其函數、參數和返回值,它是WebService用戶端和伺服器端都能理解的標準格式。因為是基於XML的,所以WSDL及時機器可閱讀的,又是人可閱讀的。WSDL檔案儲存在Web伺服器上,通過一個url地址就可以訪問到它。用戶端要調用一個WebService服務之前,要知道該服務的WSDL檔案的地址。WebService服務提供者可以通過兩種方式來暴露它的WSDL檔案地址:1、註冊到UUID伺服器,以便被人尋找;2、直接告訴給用戶端調用者。
2) Apache相關配置
為了能夠實現Web Service,httpd必須支援soap的擴充,這裡以yum安裝httpd及soap擴充為例進行說明:
1> 安裝httpd
yum install httpd
2> 安裝php
yum install php
3> 配置httpd支援php解析
在/etc/httpd/conf/httpd.conf中添加如下:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
4> 重新啟動httpd
service httpd restart
5> 檢查是否安裝了soap擴充
/usr/bin/php -m | grep soap //! 如果存在則說明已經安裝了soap擴充,如果不存在,執行下一步
6> 安裝soap擴充
yum install php-soap //! 安裝完之後再次檢查,重啟httpd
7> 驗證soap擴充是否正確安裝
既可以通過php -m | grep soap的方式,也可以通過phpinfo();的方式。
3) PHP實現WebService服務端
1> 定義服務類——Service.php
該服務端就是實現你想要對外提供的介面,假設我們需要對外提供一個函數,它接收一個字串,然後返回”Hello ” + 輸入的字串這個小功能,服務類很簡單,如下所示:
<?php class Service {public function sayHello($content){ return "Hello ".$content;} }?>
2> 產生wsdl檔案——create_wsdl.php
為了產生wsdl檔案,我們可以使用網上提供的SoapDiscovery.class.php中的getWSDL提供的方法來實現,該SoapDiscovery.class.php的代碼在網上可以下載到,為了組建檔案,我們需要修改getWSDL方法中的部分代碼(加上寫檔案的代碼),如下所示:
//return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>');//!注釋掉return,添加如下代碼,目的是為了調用getWSDL產生.wsdl檔案$fso = fopen($this->class_name.".wsdl", "w");fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>')); fclose($fso);
現在我們就可以定義自己的create_wsdl.php了,只需要調用一下這個方法即可,如下:
<?php include("Service.php");include("SoapDiscovery.class.php");//! 第一個參數是類名,產生的wsdl檔案就是以它來命名的;第二個參數是服務的名稱,可以隨便寫$disco = new SoapDiscovery('Service', 'soap');$disco->getWSDL();?>
3> 修改服務端——Service.php
修改Service.php,添加一些代碼,如下所示:
<?php class Service {public function sayHello($content){ return "Hello ".$content;} } $service = new SoapServer('http://192.168.17.129/soap/Service.wsdl', array('soap_version' => SOAP_1_2)); $service->setClass("Service"); //! 註冊Service類的所有方法 $service->handle(); //! 處理請求?>
4> 修改Service.wsdl檔案
5> 用戶端測試——client.php
client.php用來測試我們剛寫的Web Server的服務端能否可用,代碼如下:
<?php $soap = new SoapClient('http://192.168.17.129/soap/Service.php?wsdl'); echo $soap->sayHello("houqd2012");?>
輸出結果如下:
Hello houqd2012