hp soap擴展最全說明,附天氣預報調用的例子


自從php5開始,我們可以不用通過php nusoap來創建php soap web service 和調用 soap了,php5內置了 soap擴展。只需要在php.ini中開啟soap的extension就可以使用了。目前的SOAP擴展支持以下3種規范。
* SOAP 1.1
* SOAP 1.2
* WSDL 1.1
SOAP擴展主要用來處理RPC形式的Web services。不過,你也可以使用文本形式的WSDL文件配合WSDL模式的服務端和客戶端。

擴展中的類
這個擴展實現了6個類。其中有三個高級的類,它們的方法很有用,它們是 SoapClient,SoapServer和SoapFault。另外三個類除了構造器外沒有其它別的方法,這三個是低級的類,它們是SoapHeader,SoapParam和SoapVar。

SoapClient類

這個類用來使用Web services。SoapClient類可以作為給定Web services的客戶端。
它有兩種操作形式:

* WSDL 模式
* Non-WSDL 模式

在WSDL模式中,構造器可以使用WSDL文件名作為參數,並從WSDL中提取服務所使用的信息。

non-WSDL模式中使用參數來傳遞要使用的信息。這個類有許多可以用來使用服務的有用的方法。其中SoapClient::__soapCall()是最重要的。這個方法可以用來調用服務中的某個操作。

SoapServer類

這 個類可以用來提供Web services。與SoapClient類似,SoapServer也有兩種操作模式:WSDL模式和non-WSDL模式。這兩種模式的意義跟 SoapClient的兩種模式一樣。在WSDL模式中,服務實現了WSDL提供的接口;在non-WSDL模式中,參數被用來管理服務的行為。

在SoapServer類的眾多方法中,有三個方法比較重要。它們是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。

SoapServer::setClass()方法設定用來實現Web Service的類。SoapServer::setClass所設定的類中的所有公共方法將成為Web Services的操作(operation)。

SoapServer::addFunction()方法用來添加一個或多個作為Web Services操作(operation)的函數。

SoapServer:: handle()方法指示Web Service腳本開始處理進入的請求。Web Service腳本是用PHP腳本寫的一個或多個SoapServer對象的實例。盡管你可以有不止一個的SoapServer對象,但通常的習慣是一個 腳本只擁有一個SoapServer實例。在調用SoapServer::handle()方法之前,Web Service腳本會使用設置在SoapServer對象實例上的任何信息來處理進入的請求和輸出的相應。
SoapFault類

這個類從Exception類繼承而來,可以用來處理錯誤。SoapFault實例可以拋出或獲取Soap錯誤的相關信息並按程序員的請求處理。

SoapHeader類

這個類可以用來描述SOAP headers。它只是一個只包含構造器方法的數據容器。

SoapParam類

SoapParam也是一個只包含構造器方法的數據容器。這個方法可以用來描述傳遞給Web services操作的參數。在non-WSDL模式中這是一個很有用的類,可以用來傳遞所期望格式的參數信息。

SoapVar類

SoapVar也是一個只包含構造器的低級類,與SoapHeader和SoapParam類相似。這個類可以用來給一個Web services操作傳遞編碼參數。這個類對non-WSDL中傳遞類型信息是非常有用的。

WSDL VS. non-WSDL模式

Web Services有兩種實現模式:契約先行(Contract first)模式和代碼先行(Code first)模式。

契約先行模式使用了一個用XML定義的服務接口的WSDL文件。WSDL文件定義了服務必須實現或客戶端必須使用的接口。SoapServer和SoapClient的WSDL模式就基於這個概念。

在 代碼先行模式中,首先要先寫出實現服務的代碼。然后在大多數情況下,代碼會產生一個契約,換種說法,一個WSDL。接着客戶端在使用服務的時候就可以使用 那個WSDL來獲得服務的接口。盡管如此,PHP5的擴展並沒有從代碼輸出一個WSDL的規定,考慮到這種情況,可以在non-WSDL模式下使用 SoapServer和SoapClient。
SOAP擴展與Hello World

WSDL模式服務

下面是WSDL模式的服務所使用的SOAP擴展API代碼:

<?php
function greet($param) {
$retval = 'Hello '.$param->name;
$result = array('greetReturn' => $retval);
return $result;
}
$server = new SoapServer('hello.wsdl');
$server->addFunction('greet');
$server->handle();
?>

在這個服務的實現過程中,函數實現了WSDL所定義的服務操作greet,greet操作有一個WSDL指定的參數,按照greet操作的語義,這個參數是一個用戶的名字。最后handle調用了觸發處理請求的服務對象。
WSDL模式客戶端

客戶端代碼如下

<?php
try {
$client = new SoapClient('hello.wsdl');
$result =  $client->__soapCall('greet', array(array('name' => 'Sam')));
printf("Result = %s", $result->greetReturn);
} catch (Exception $e) {
printf("Message = %s",$e->__toString());
}
?>

客戶端代碼中,首先創建一個使用WSDL文件作參數的SoapClient實例。接着__soapCall()調用作為參數傳入它的操作,也就是greet和傳入操作的參數。

需要注意的是參數的寫法。需要包上兩層數組,而且參數的名稱一定要傳過去。

non-WSDL模式服務端

<?php
function greet($param) {
$retval = 'Hello '.$param;
return new SoapParam($retval, 'greetReturn');
}
$server = new SoapServer(null, array('uri' => 'http://wso2.org/wsf/php/helloService'));
$server->addFunction('greet');
$server->handle();
?>

在non -WSDL模式中,想WSDL模式一樣首先實現greet函數的功能,但是函數實現的方式跟WSDL模式稍稍有所不同。在non-WSDL模式中,我們必 須返回一個SoapParam對象作為響應,而不是一個數組。創建服務時,第一個參數設為null,說明沒有提供WSDL;接着傳遞一個選項作為參數,這 個選項參數是服務的URI。最后像WSDL模式一樣調用剩下的方法。

non-WSDL模式客戶端

<?php
try {
$client = new SoapClient(null,
array('location' => 'http://localhost/hello/hello_service_nonwsdl.php',
'uri' => 'http://wso2.org/wsf/php/helloService'));
$result =  $client->__soapCall('greet', array(new SoapParam('Sam', 'name')));    printf("Result = %s", $result);
} catch (Exception $e) {
printf("Message = %s",$e->__toString());
}
?>

在non-WSDL模式中,因為沒有使用WSDL,傳遞了一個包含服務所在位置和服務URI的參數數組作為參數。然后象WSDL模式中一樣調用__soapCall()方法,但是使用了SoapParam類用指定格式打包參數。返回的結果將獲取greet中的響應。

同樣注意參數的寫法。

下面是一個例子:

調用 webxml的天氣預報的:

webxml 官方網址:http://www.webxml.com.cn/zh_cn/weather_icon.aspx

<?php
$ws = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl";
$client = new SoapClient( $this->ws);//使用 wsdl方式
$cityCode = "991";
$result = $client->getWeather(array('theCityCode'=>$cityCode));
var_dump($result);
?>

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com