Web Service技術, 能使得運行在不同機器上的不同應用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數據或集成。依據Web Service規范實施的應用之間, 無論它們所使用的語言、 平台或內部協議是什么, 都可以相互交換數據。Web Service是自描述、 自包含的可用網絡模塊, 可以執行具體的業務功能。Web Service也很容易部署, 因為它們基於一些常規的產業標准以及已有的一些技術,諸如標准通用標記語言下的子集XML、HTTP。Web Service減少了應用接口的花費。Web Service為整個企業甚至多個組織之間的業務流程的集成提供了一個通用機制。[1]
WSDL,網絡服務描述語言是一個用來描述Web服務和說明如何與Web服務通信的XML(標准通用標記語言的子集)語言。為用戶提供詳細的接口說明書。[2]
1、Seb Service 公共接口的使用
Web Service技術應用已經非常廣泛,使用java調用比較方便,在eclipse中新建Web Service Client根據向導配置即可,如圖:
在PHP中使用則相對比較復雜一點,網上也有朋友開源的PHP 寫的WSDLInterpreter等,其實PHP自身有SoapClient類可以直接使用,下面的就是摘自http://www.zendstudio.net/[3]:
<?php /** * 從開放的天氣預報服務中獲得數據 * **/ $c = new SoapClient( 'http://www.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl', array( 'trace' => true, 'exceptions' => true ) ); //查看接口中的方法 //var_dump( $c->__getFunctions() ); //查看接口方法的使用 //var_dump( $c->__getTypes() ); //不需要參數的情況 $pr =$c->getRegionProvince(); //var_dump( $pr->getRegionProvinceResult->string ); //帶有參數的情況 $scs = $c->getSupportCityString( array( 'theRegionCode' => '福建' ) ); var_dump( $scs->getSupportCityStringResult->string ); //也可以這樣做 $we = $c->__call('getWeather', array( array( 'theCityCode' => 2210 ) ) ); var_dump( $we ); ?>
2、相關擴展
(下面都是借花獻佛的摘抄了)[3]
1) 實現php的soapServer和SoapClient
服務端:
<?php $ss = new SoapServer( null, array( 'uri' => 'http://zendstudio.Net' ) ); $ss->setClass( 't', '參數1', '參數2' ); $ss->handle(); //$request = file_get_contents( 'php://input' ); //file_put_contents( 'request.txt', $request ); class t{ function __construct( $p1, $p2 ){ } function im8( $g ){ return 'OK----'. $g; } } ?>
客戶端:
<?php $ss = new SoapClient( null, array( 'uri' => 'http://zendstudio.Net', 'location' => 'http://localhost/soap.php' ) ); $header = new SoapHeader( 'zendHeader', 'mmcYY', '12345678' ); $ss->__setSoapHeaders( $header ); echo $ss->im8( 'gently' ); ?>
2) 在php的soap客戶端和服務端添加SoapHeader頭
實例化一個SoapHeader,然后使用SoapServer的addSoapHeader方法添加進去即可,這個頭一般是學習php soap的一個難點,通常我們做的最多的是用soap的方式和其他程序通信,用php如何構造soapheader顯得有些不容易,以至於依賴於這個頭的服務端總是返回不正確。
3) 從php的服務端如何獲取SoapHeader
這個大概就是很多人認為php對soap支持不完整的一個原因,目前的php版本無法直接獲取SoapHeader,因此我想了一個笨方法,先通過使用php://input,獲取所有POST上來的數據,然后使用正則表達式分離出SoapHeader的XML部分,然后再整理出想要的格式。
另外,在PHP的SoapServer端可以通過轉存$_SERVER和上面講到的php://input獲取soap的“原始”通信內容。
參考:
[1] Web Service[EB/OL].[2014-04-01].http://baike.baidu.com/link?url=61fuMHphEG7AgK40xVxpvVnT5dlJSqFEVGN9LpsRGGXg87sdw_clM7ov8SCOioVyAZH8ZtA1_3SAopPE5y2dza
[2] WSDL[EB/OL].[2014-04-01].http://baike.baidu.com/link?url=HgL3uLMQMa8FF1Kwe5pmu_ejvmdzxXm3R0uT0P61LveNcdDYhfL7RRn0DaJZEKQZ
[3] 入門級的講講soap這個php webservice[EB/OL].[2014-04-01].http://www.zendstudio.net/archives/php-webservice-soap/