歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

PHP寫Web Service服務端

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("linuxidc");
?>

輸出結果如下:

Hello linuxidc

Copyright © Linux教程網 All Rights Reserved