Web Service的開發與應用基礎
Web Service基於SOAP協議,而SOAP本身符合XML語法規範。雖然爲Web Service提供了強大的支持,但瞭解其基本機制對於程序員來說仍然是必需的。
1.1 神馬是SOAP協議?
SOAP協議的全稱是簡單對象訪問協議(Simple Object Access Protocol),SOAP致力於以XML形式提供一個簡單、輕量的用於在分散或分佈環境中交換結構化和類型信息的機制。SOAP只規範對象訪問的方式,而不限制具體實現的技術環境,這意味着SOAP協議是一種跨平臺的協議:一個客戶端程序可以按照SOAP協議訪問一個基於JavaEE技術體系結構的Web Service。SOAP訪問仍然基於HTTP協議,同時其內容又以XML形式展現。
SOAP規範由四部分組成:
① SOAP信封(SOAP envelop)
② SOAP編碼規則(SOAP encoding rules)
③ SOAP RPC表示(SOAP RPC representation)
④ SOAP綁定(SOAP binding)
這裏不對這四部分展開介紹,通過下面的一個小例子來直觀地認識一下。
(1)在Web服務端,打算對外提供一個公共方法來供客戶端調用,而客戶端則需要提供這個方法需要的參數,並且最終得到返回值。假設這個方法被申明在文件中:
[WebMethod]
public string GetSumString(int para1, int para2)
{
int result = para1 + para2;
return ring();
}
(2)當客戶端試圖使用這個Web Service方法時,就需要向服務器端發出這樣的一個HTTP請求:
POST / HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: ""
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap="">
<soap:Body>
<GetSumString xmlns="">
<para1>250</para1>
<para2>250</para2>
</GetSumString>
</soap:Body>
</soap:Envelope>
(3)等到Web Service服務器端接收到上面的請求之後,就可以進行相應的邏輯處理,並且返回結果。根據SOAP協議,HTTP響應如下形式:
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap="">
<soap:Body>
<GetSumStringResponse xmlns="">
<GetSumStringResult>500</GetSumStringResult>
</GetSumStringResponse>
</soap:Body>
</soap:Envelope>
如此一來,客戶端就得到了服務端的處理結果,換句話說,客戶端已經得到了Web Service提供的服務。
PS:最後,再說一下SOAP協議和HTTP協議,它們的關係非常類似於網絡分層中的上下層協議,使用SOAP協議的雙方將SOAP數據包放入HTTP報文之中,並且通過HTTP協議完成實際的傳輸,換句話說,SOAP是對HTTP的一個封裝,下圖說明了這一過程:
1.2 WSDL又是什麼鬼,它有啥作用?
(1)WSDL介紹
WSDL(Web Service Description Language)是Web服務描述語言,它是一種由微軟、IBM、Intel等大型供應商提出的語言規範,目的就是爲了描述Web服務器所提供的'服務,以供使用者參考。WSDL是一種複合XML語法規範的語言,它的設計完全基於SOAP協議,當一個Web Service服務器期望爲使用者提供服務說明時,WSDL是最好的選擇之一。
這裏仍以上面的實例來說明,在Web服務端提供了這樣一個方法:
string GetSumString(int para1, int para2)
當服務端視圖利用WSDL告訴客戶端如何使用該方法時,就會提供下面的這樣一個WSDL文件(仍然是一個XML):
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tm="" xmlns:soapenc="" xmlns:mime="" xmlns:tns="" xmlns:soap="" xmlns:s="" xmlns:soap12="" xmlns:http="" targetNamespace="" xmlns:wsdl="">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="">
<s:element name="GetSumString">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="para1" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="para2" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetSumStringResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetSumStringResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="GetSumStringSoapIn">
<wsdl:part name="parameters" element="tns:GetSumString" />
</wsdl:message>
<wsdl:message name="GetSumStringSoapOut">
<wsdl:part name="parameters" element="tns:GetSumStringResponse" />
</wsdl:message>
<!-- 這裏省略其他定義 -->
</wsdl:definitions>
如上xml所示,在<wsdl:types>節點下,WSDL定義了GetSumString方法的名字:
<s:element name="GetSumString">
參數數量、每個參數的類型:
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="para1" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="para2" type="s:int" />
</s:sequence>
</s:complexType>
以及返回參數的類型:
<s:element name="GetSumStringResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetSumStringResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
通過完整的描述,使用者就能夠了解如何使用該Web服務了。
(2)獲取和使用WSDL
當Web Service服務器提供WSDL時,就可以通過特定的工具獲得WSDL文件。最直接的方式就是在URL中直接添加WSDL參數,來發送得到WSDL文件的請求,如下所示:
http://localhost:6105/
這時點擊回車就可以得到如下圖所示的WSDL結果:
1.3 Web Service中如何處理附件?
儘管Web Service提供的方法的參數類型沒有任何限制,也就意味着所有的附件可以通過字節數組來進行傳遞,但是把字節流直接內嵌在SOAP消息的做法有很多問題,這也曾經成爲XML語法和SOAP協議被詬病的原因。這裏主要介紹一下XOP的概念。
在XOP出現之前,SOAP處理二進制數據的方式都很簡單,比如當一個Web Service服務端提供瞭如下的方法時:
void UploadSmallAttach(Byte[] attachment)
客戶端調用該Web Service,只需要發出下面這樣的SOAP請求即可:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap="">
<soap:Body>
<UploadSmallAttach xmlns="">
<attachment>D0CF11E0A1B11AE100000000000000000000000003E00003
00FEFF09000600000000000000000000000600000000000000000000
DE0200000000000000000000001000000000000000FEFFFFFFFF000
00000000000000000D80200000000000D9020000DA02000DB02000
000DC020000DD0200000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFF</attachment>
</UploadSmallAttach>
</soap:Body>
</soap:Envelope>
如上所示,其中<attachment>節點下的一大堆字符,就是某個文件的字節流。通過這種方式,確實是可以實現傳送二進制附件的功能的,但這樣的處理過於粗略,且傳輸沒有任何優化。W3C爲此特別指定了XOP規範。
XOP(XML-binary Optimized Packages)意爲XML二進制打包,它把二進制數據流從SOAP消息中分離出來,進行單獨打包。上述的客戶端請求如果使用XOP規範的話,將轉變爲如下結果:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap="">
<soap:Body>
<UploadSmallAttach xmlns="">
<attachment>
<xop:Include xmlns="" href="cid:http://www.book.com/attachment.png" />
</attachment>
</UploadSmallAttach>
</soap:Body>
</soap:Envelope>
可以看到,原本出現在二進制字節流的地方,被轉換成了一個引用:
<attachment>
<xop:Include xmlns="" href="cid:http://www.book.com/attachment.png" />
</attachment>
這樣整個SOAP信封節點下就不再包含任何二進制直接,而福建則被安放在另一個MIME體中:
Content-Type: image/png
Content-Transfer-Encoding: binary
Content-ID: >
D0CF11E0A1B11AE100000000000000000000000003E0000300FEFF090006
00000000000000000000000600000000000000000000DE0200000000000
000000000001000000000000000FEFFFFFFFF00000000000000000000D8
0200000000000D9020000DA02000DB02000000DC020000DD020000000
0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
相關文章
-
C#開發和調用Web Service實例
Web Service也叫XML Web Service WebService是一種可以接收從Inteet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。 1.1、Web Service基本概念Web Service是通過SOAP在Web上提供的軟件服務,使 -
j2ee培訓:如何構建RESTful Web Service
JavaEE的核心是EJB3.0, 其提供了更兼便捷的企業級的應用框架。下面yjbys小編爲大家準備了關於如何構建RESTful Web Service的.文章,歡迎閱讀。 1. 首先是實體類,注意其中的@XmlRootElement註解package s;import ;imp -
WebService自動化-WSDL調用
在做自動化測試的過程中,有時候需要測試一個業務流程特定的部分, 這個特定部分可能是接口,它往往需要依賴前期產生的數據輸出作爲輸入,這個時候,重新跑一遍前邊流程來獲得需要的數據顯然不合理, 那麼利用後端開發發佈出來的 -
XFire創建WebService實例
XFire使得在JavaEE應用中發佈Web服務變得輕而易舉。和其他Web服務引擎相比,XFire的配置非常簡單,可以非常容易地和Spring集成。那麼XFire怎麼創建WebService,下面yjbys小編爲大家分享XFire創建WebService簡單實例: 一. -
如何使用Web Service傳輸文件
server對外只開放80端口,並且還需要提供文件上傳和下載功能的應用,下面yjbys小編爲大家準備了關於如何使用Web Service傳輸文件的文章,歡迎閱讀。 1. 首先是一個封裝了服務器端文件路徑,客戶端文件路徑和要傳輸的字節 -
利用PowerBuilder開發計算機WEB應用
1 引言隨着計算機網絡技術的日趨成熟,Inteet的發展迅速,Inteet應用開發將是現在和將來信息系統開發的主要技術方向之一,利用PowerBuilder開發WEB應用。PowerBuilder是Sybase公司推出的用於企業級應用的開發工具,該工具不 -
WebService的優缺點
Web service是一個平臺的獨立,低耦合的,自包含的、基於可編程的web的應用程序,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發佈、發現、協調和配置這些應用程序,用於開發分佈式的互操作的應用程序。 1 -
Java如何調用WebService
Java如何調用WebService?爲了方便大家,特意整理如下文章,下面一起來和小編看看吧!package biz;import ;import Format;import ;import ice;import e;import ger;import meterMode;public class TempService {public sta -
Axis2創建WebService實例教程
我們心裏有一些收穫後,可以將其記錄在心得體會中,這樣可以幫助我們總結以往思想、工作和學習。那麼心得體會該怎麼寫?想必這讓大家都很苦惱吧,下面是小編收集整理的小王子讀書心得,歡迎大家分享。小王子讀書心得1晚上您得 -
如何創建安全的Web Service
我們在使用Web Service的`過程中,很多情況是需要對web service請求做認證的,對於運行在web容器裏的應用程序來說,可能會比較簡單一些,通常可以通過filter來做一些處理,但是其實CXF本身也提供了對web service認證的方式。