今天我打算總結(jié)下php自帶的soap類的使用,總結(jié)才有進(jìn)步。
這里通過一個開放的提供soap webservice接口的網(wǎng)站說明下如何根據(jù)wsdl(什么是wsdl?)使用php調(diào)用現(xiàn)有的soap服務(wù)!
<?php/** * 從開放的天氣預(yù)報服務(wù)中獲得數(shù)據(jù) ***/ $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() );//不需要參數(shù)的情況$pr =$c->getRegionProvince();//var_dump( $pr->getRegionProvinceResult->string ); //帶有參數(shù)的情況$scs = $c->getSupportCityString( array( 'theRegionCode' => '福建' ) );var_dump( $scs->getSupportCityStringResult->string ); //也可以這樣做$we = $c->__call('getWeather', array( array( 'theCityCode' => 2210 ) ) );var_dump( $we );?>還是看代碼不說話,我這里有個簡單的例子,注意,實際應(yīng)用中一定要對異常進(jìn)行處理,否則不方便和php以外的程序通信。
這是服務(wù)端代碼:
<?php$ss = new SoapServer( null, array( 'uri' => 'http://zendstudio.Net' ) );$ss->setClass( 't', '參數(shù)1', '參數(shù)2' );$ss->handle();//$request = file_get_contents( 'php://input' );//file_put_contents( 'request.txt', $request );html' target='_blank'>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' ); ?>
實際上,上面的例子已經(jīng)實現(xiàn)了在客戶端添加SoapHeader,而服務(wù)端的添加SoapHeader同樣的簡單,實例化一個SoapHeader,然后使用SoapServer的addSoapHeader方法添加進(jìn)去即可,這個頭一般是學(xué)習(xí)php soap的一個難點,通常我們做的最多的是用soap的方式和其他程序通信,用php如何構(gòu)造soapheader顯得有些不容易,以至于依賴于這個頭的服務(wù)端總是返回不正確。
這個大概就是很多人認(rèn)為php對soap支持不完整的一個原因,目前的php版本無法直接獲取SoapHeader,因此我想了一個笨方法,先通過使用php://input,獲取所有POST上來的數(shù)據(jù),然后使用正則表達(dá)式分離出SoapHeader的XML部分,然后再整理出想要的格式。
另外,在PHP的SoapServer端可以通過轉(zhuǎn)存$_SERVER和上面講到的php://input獲取soap的“原始”通信內(nèi)容。
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答
圖片精選