標籤:style blog http color io os 使用 ar java
1. web service普及: Webservice soap wsdl差別之個人見解
Web Service實現業務訴求: Web Service是真正“辦事”的那個,提供一種辦事介面的統稱。
WSDL提供“能辦的事的文檔說明”: 對要提供的服務的一種描寫敘述格式。我想幫你的忙,可是我要告訴你我都能幹什麼,以及幹這些事情須要的參數類型。
SOAP提供“請求”的規範: 向服務介面傳遞請求的格式,包含方法和參數等。你想讓人家辦事,總得告訴人家你想幹什麼吧,SOAP就是定義這個“請求”的格式的,依照SOAP定義的“請求”格式“書寫”請求就行保證Web Service可以正確的解讀你想讓它幹什麼以及你為它提供了什麼參數。在這個請求中,你須要描寫敘述的主要問題有:向哪個Web Service發送請求,請求的參數類型、參數值、返回值類型。這些都“填寫”完畢,也就完畢了符合SOAP規範的SOAP訊息。
wsdl和soap儘管是web service的兩大標準,可是兩者並沒有必定的聯絡,都能夠獨立使用。
wsdl提供了一個統一的介面,眼下已經成為一個國際上公認的標準,通過wsdl提供的介面能夠訪問不同類型的資源(如java、c#、C、C、C++等),由於wsdl是基於xml,與語言平台無關的。另外wsdl提供了binding和service元素,用以綁定介面到詳細的服務,實現了介面與實現的分離。
soap(簡單對象訪問協議)是一種基於http的傳輸協議,用來訪問遠程服務
wsdl與soap的關係在於:wsdl綁定服務的時候能夠設定使用的協議,協議能夠是soap、http、smtp、ftp等不論什麼一種傳輸協議,除此以外wsdl還能夠綁定jms、ejb及local java等等,只是都是須要對binding和service元素做擴充的,並且須要擴充server的功能以支援這樣的擴充
soap協議是一種請求和應答協議規範,而http是web傳輸協議,soap的傳輸是能夠基於http的,但也能夠基於其它的傳輸協議,如ftp、smtp等。
簡單對象訪問協議(SOAP)是W3C組織的一個Note, 它描寫敘述了一種在分散的或分布式的環境中怎樣交換資訊的輕量級協議。SOAP是一個基於XML的協議,它包含三個部分:SOAP封裝(Envelop),封裝定義了一個描寫敘述訊息中的內容是什麼,是誰發送的,誰應當接受並處理它以及怎樣處理它們的架構;SOAP編碼規則(Encoding Rules),用於表示應用程式須要使用的資料類型的執行個體;SOAP RPC表示(RPC Representation),表示遠端程序呼叫和應答的協定;SOAP能夠和多種傳輸協議綁定(Binding),使用底層協議交換資訊。在這個文檔中,眼下僅僅定義了SOAP怎樣和HTTP以及HTTP擴充進行綁定的架構。
SOAP是個通訊協定, SOAP在HTTP協議的基礎上,把編寫成XML的REQUEST參數, 放在HTTP BODY上提交個WEB SERVICEserver(SERVLET,ASP什麼的) 處理完畢後,結果也寫成XML作為RESPONSE送回使用者端, 為了使使用者端和WEB SERVICE能夠相互相應,能夠使用WSDL作為這樣的通訊方式的描寫敘述檔案,利用WSDL工具能夠自己主動產生WS和使用者端的架構檔案,SOAP具備把複雜物件序列化捆綁到XML裡去的能力。
SOAP的前身是RPC, 就是遠程呼叫處理的協議,這個協議安全性不是非常好,多數防火牆都會阻擋RPC的通訊包,而SOAP則使用HTTP協議作為主要的協議,使用port80使得SOAP能夠透過防火牆,完畢RPC的功能。
SOAP協議和HTTP協議一樣,都是底層的通訊協定,僅僅是請求包的格式不同而已,SOAP包是XML格式的,如今我們編寫WEB SERVICE不須要深入理解SOAP也沒關係。假設SERVICE和CLIENT在相同的環境下使用SOAP,因為普通情況下都有自己主動產生SOAP程式架構的工具,因此不知道細節也沒關係. 但是, 假設CLIENT和SERVICE的環境不同,比方說JAVA的Client和.NET的SERVICE進行通訊,或者是VB CLIENT和TOMCAT下的JAVA SERVICE通訊,還是要知道一點細節為好. 特別是, WSDL或者UDDI都不是標準,假設不讓用就僅僅好手工配製SOAP MESSAGE啦。
2. 使用類 "SoapDiscovery.class.php" 產生wsdl文檔!
SOAP類型的介面
無關程式設計語言、無關平台、擴充性非常好
要實現一個SOAP 型的介面,有兩種方式:一種有WSDL檔案方式、一中無WSDL檔案方式!
對於熱愛研究型的人來說,使用第一種方式能夠讓你清楚的瞭解PHP是怎麼建立了一個Web Service!但第一種對於新手來說,建立一個XML格式的WSDL檔案,是比較難的,這你的先瞭解熟悉什麼是XML!學會XML文法!但對於一個急於解決這個問題的人來說!沒有這麼多的時間去熟悉!所以這是件煩惱的事!只是不急,上面說了,另一種無需WSDL檔案的方式!並且,本解說還提供了一個自己主動產生WSDL檔案的類!
解說前,先配置下PHP的soap環境支援:
找到php.ini檔案
;extension=php_soap.dll
刪除掉";" ,重新啟動apacheserver
一、有WSDL檔案方式
在這裡先介紹標準的webservice。 那麼怎樣建立wsdl呢?對於PHP來說這確實是件非常不easy的事情,有人說用zend studio建立非常方便,這是一種方法。但對於那些不喜歡用zend studio的人來說,會認為建立一個web service還要安裝zend studio,太強人所難了。
在這裡介紹一個簡單的方法,到網上下載SoapDiscovery.class.php類(我本地有下載的),裡面有個公用方法:getWSDL(),這種方法末尾是用的return語句,那麼,你改動一下這種方法:
//return sprintf(‘%s%s%s%s%s%s‘, $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, ‘</definitions>‘);
//產生wsdl檔案,將上面的return凝視去掉,那麼
$fso = fopen($this->class_name . ".wsdl" , "w");
fwrite($fso, sprintf(‘%s%s%s%s%s%s‘, $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, ‘</definitions>‘));
如今產生wsdl的類有了,SoapDiscovery.class.php(原始碼在最末尾)。
再準備一個提供服務的Service.php類檔案或者函數就能夠建立wsdl了!
<?php
class Service {
public function HelloWorld() {
return "Hello";
}
public function Add($a, $b) {
return $a + $b;
}
}
?>
以下建立wsdl檔案的creat_wsdl.php
<?php
include("Service.php");
include("SoapDiscovery.class.php");
$disc = new SoapDiscovery(‘Service‘, ‘soap‘); //第一個參數是類名(產生的wsdl檔案就是以它來命名的,比如:以下的Service.wsdl),即Service類,第二個參數是服務的名字(這個能夠隨便寫)
$disc->getWSDL();
##說明:通過查看"SoapDiscovery.class.php"檔案的原始碼發現,此成員函數假設開啟return語句,會返回一個xml格式的字串,假設用 $strXML = $disc->getWSDL();echo $strXML;那麼在瀏覽器中將不能顯示xml的wsdl檔案。由於瀏覽器預設用的是"html/text"來返回stdout的內容,須要在php指令碼的頭部用:
header("Content-type: text/html; charset=utf-8"); 才幹夠讓瀏覽器不把輸出作為html而是作為xml來解析!
用web訪問的方式執行create_wsdl.php檔案,此時會產生一個Service.wsdl的檔案,以下將會用到這個檔案!
注意:上面方法產生的wsdl檔案在windows以下沒問題,可是在Linux以下的wsdl檔案裡的"location=XXX" 段,確實沒有serverIP地址。所以要改動該代碼中的: $_SERVER[‘SERVER_NAME‘] 為 $_SERVER[‘SERVER_HOST‘] ,由於在linux(nginx)以下,前者變數為空白,這樣才幹產生正確的wsdl文檔!
再在Service.php檔案裡加入?一些代碼
<?php
class Service {
public function HelloWorld() {
return "Hello";
}
public function Add($a, $b) {
return $a + $b;
}
}
$server = new SoapServer(‘Service.wsdl‘, array(‘soap_version‘ => SOAP_1_2)); ##此處的Service.wsdl檔案是上面產生的
$server->setClass("Service"); //注冊Service類的全部方法
$server->handle(); //處理請求
?>
建立webservice用戶端程式,測試webservice是否有效,檔案名稱是:client.php
將下面內容拷貝進去:
<?php
ini_set(‘soap.wsdl_cache_enabled‘, "0"); //關閉wsdl緩衝
$soap = new SoapClient(‘http://localhost/Dragon/soap/Service.php?wsdl‘);
echo $soap->Add(28, 2);
echo $soap->__soapCall(‘Add‘,array(28,2))//或這樣調用
#echo $soap->__Call(‘Add‘,array(28,2));
?>
OK!測試通過!
二、無WSDL檔案方式
server端
<?php
class Service
{
public function HelloWorld()
{
return "Hello";
}
public function Add($a,$b)
{
return $a+$b;
}
}
$server=new SoapServer(null,array(‘uri‘ => "abcd"));
$server->setClass("Service");
$server->handle();
?>
client
<?php
try {
$soap = new SoapClient(null, array(
"location" => "http://localhost/Dragon/soap/Service.php",
"uri" => "abcd", //資源描寫敘述符server和client必須相應
"style" => SOAP_RPC,
"use" => SOAP_ENCODED
));
echo $soap->Add(12, 2);
} catch (Exction $e) {
echo print_r($e->getMessage(), true);
}
?>
php學習之道:php中soap的使用執行個體以及產生WSDL檔案,提供自己主動產生WSDL檔案的類庫——SoapDiscovery.class.php類