Like Share Discussion Bookmark Smile

J.J. Huang   2020-02-26   Tech.   瀏覽次數:

技術觀念 | Web Service(Web服務)

Web Service是一種服務導向架構的技術,透過標準的Web協議提供服務,目的是保證不同平台的應用服務可以互操作。

根據W3C的定義,Web服務(Web Service)應當是一個軟體系統,用以支持網路間不同機器的互動操作。網路服務通常是許多應用程式接口(API)所組成的,它們透過網路,例如國際網際網路(Internet)的遠程伺服機端,執行客戶所提交服務的請求。

儘管W3C的定義涵蓋諸多相異且無法介分的系統,不過通常我們指有關於主從式架構(Client-server)之間根據SOAP協議進行傳遞XML格式消息。無論定義還是實現,Web Service過程中會由伺服機提供一個機器可讀的描述(通常基於WSDL)以辨識伺服機所提供的Web Service。另外,雖然WSDL不是SOAP服務端點的必要條件,但目前基於Java的主流Web Service開發框架往往需要WSDL實現客戶端的原始碼生成。一些工業標準化組織,比如WS-I,就在Web Service定義中強制包含SOAPWSDL

更多的「核心定義」、「協議集」,可以參考維基百科-Web服務

Web Service 到底是什麼?

一言以蔽之:Web Service是一種跨程式語言和跨作業系統平臺的遠端呼叫技術。

  • 跨程式語言和跨操作平臺:
    就是說服務端程式採用java編寫,客戶端程式則可以採用其他程式語言編寫,反之亦然!跨作業系統平臺則是指服務端程式和客戶端程式可以在不同的作業系統上執行。

  • 所謂遠端呼叫:
    就是一臺計算機a上的一個程式可以呼叫到另外一臺計算機b上的一個物件的方法。
    例(1):銀聯提供給商場的POS刷卡系統,商場的POS機轉帳調用的轉賬方法的程式碼其實是跑在銀行伺服器上。
    例(2):amazon、天氣預報系統、淘寶網、校內網、百度⋯⋯等把自己的系統服務以Web Service服務的形式暴露出來,讓第三方網站和程式可以呼叫這些服務功能,這樣擴充套件了自己系統的市場佔有率,往大的概念上吹,就是所謂的SOA應用。

從多個角度來理解Web Service,從表面上看,Web Service就是一個應用程式向外界暴露出一個能通過Web進行呼叫的API,也就是說能用程式設計的方法通過Web來呼叫這個應用程式。我們把呼叫這個Web Service的應用程式叫做客戶端,而把提供這個Web Service的應用程式叫做服務端。

從深層次看,Web Service是建立可互操作的分散式應用程式的新平臺,是一個平臺,是一套標準。它定義了應用程式如何在Web上實現互操作性,你可以用任何你喜歡的語言,在任何你喜歡的平臺上寫Web service,只要我們可以通過Web service標準對這些服務進行查詢和訪問。

Web Service平臺需要一套協議來實現分散式應用程式的建立。任何平臺都有它的資料表示方法和型別系統。

要實現互操作性,Web Service平臺必須提供一套標準的型別系統,用於溝通不同平臺、程式語言和元件模型中的不同型別系統。Web service平臺必須提供一種標準來描述Web service,讓客戶可以得到足夠的資訊來呼叫這個Web service。最後,我們還必須有一種方法來對這個Web service進行遠程呼叫,這種方法實際是一種遠端過程呼叫協議(RPC)。為了達到互操作性,這種RPC協議還必須與平臺和程式語言無關。

Web Service 平臺技術

XML XSDSOAPWSDL就是構成Web Service平臺的三大技術。

  • XML XSD:

Web Service採用HTTP協議傳輸資料,採用XML格式封裝資料(即XML中說明呼叫遠端服務物件的哪個方法,傳遞的引數是什麼,以及服務物件的返回結果是什麼)。

XMLWeb Service平臺中表示資料的格式。除了易於建立和易於分析外,XML主要的優點在於它既是平臺無關的,又是廠商無關
的。無關性是比技術優越性更重要的:軟體廠商是不會選擇一個由競爭對手所發明的技術的。

XML解決了資料表示的問題,但它沒有定義一套標準的資料型別,更沒有說怎麼去擴充套件這套資料型別。
例如:整形數到底代表什麼?16位32位64位?這些細節對實現互操作性很重要。

XML Schema(XSD)就是專門解決這個問題的一套標準。它定義了一套標準的資料型別,並給出了一種語言來擴充套件這套資料型別。

Web Service平臺就是用XSD來作為其資料型別系統的。當你用某種語言(如VB.NETC#)來構造一個Web service時,為了符合Web Service標準,所有你使用的資料型別都必須被轉換為XSD型別。你用的工具可能已經自動幫你完成了這個轉換,但你很可能會根據你的需要修改一下轉換過程。

  • note.xml
1
2
3
4
5
6
7
<?xml version="1.0"?>
<note>
<to>George</to>
<from>MoroseDog</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
  • note.xsd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://morosedog.gitlab.io/2020/XMLSchema"
targetNamespace="http://morosedog.gitlab.io"
xmlns="http://morosedog.gitlab.io"
elementFormDefault="qualified">

<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

note.xsdXML Schema文件,它定義了上面那個XML文件的元素。

  • SOAP:

Web Service通過HTTP協議傳送請求和接收結果時,傳送的請求內容和結果內容都採用XML格式封裝,並增加了一些特定的HTTP訊息頭,以說明HTTP訊息的內容格式,這些特定的HTTP訊息頭和XML內容格式就是SOAP協議。SOAP提供了標準的RPC方法來呼叫Web Service

SOAP協議 = HTTP協議 + XML資料格式

SOAP協議定義了SOAP訊息的格式,SOAP協議是基於HTTP協議的,SOAP也是基於XMLXSD的,XMLSOAP的資料編碼方式。
比喻:HTTP就是普通公路,XML就是中間的綠色隔離帶和兩邊的防護欄,SOAP就是普通公路經過加隔離帶和防護欄改造過的高速公路。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://morosedog.gitlab.io/2001/12/soap-envelope"
soap:encodingStyle="http://morosedog.gitlab.io/2001/12/soap-encoding">

<soap:Header>
...
...
</soap:Header>

<soap:Body>
...
...
<soap:Fault>
...
...
</soap:Fault>
</soap:Body>

</soap:Envelope>
  • WSDL:

好比我們去商店買東西,首先要知道商店裡有什麼東西可買,然後再來購買,商家的做法就是張貼廣告海報。

Web Service也一樣,Web Service客戶端要呼叫一個Web Service服務,首先要有知道這個服務的地址在哪,以及這個服務裡有什麼方
法可以呼叫,所以Web Service務器端首先要通過一個WSDL檔案來說明自己家裡有啥服務可以對外呼叫,服務是什麼(服務中有哪些方法,方法接受的引數是什麼,返回值是什麼),服務的網路地址用哪個url地址表示,服務通過什麼方式來呼叫。

WSDL(Web Services Description Language)就是這樣一個基於XML的語言,用於描述Web Service及其函式、引數和返回值。它是Web Service客戶端和伺服器端都能理解的標準格式。因為是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的Web service生成WSDL文件,又能匯入WSDL文件,生成呼叫相應Web Service的代理類程式碼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>

<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>

<portType name="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>

WSDL檔案儲存在Web伺服器上,通過一個url地址就可以訪問到它。客戶端要呼叫一個Web Service服務之前,要知道該服務的WSDL檔案的地址。
Web Service服務提供商可以通過兩種方式來暴露它的WSDL檔案地址:
1.註冊到UDDI伺服器,以便被人查詢
2.直接告訴給客戶端呼叫者。

Web Service 開發

Web Service開發可以分為伺服器端開發和客戶端開發兩個方面:

  • 服務端開發:
    把公司內部系統的業務方法釋出成Web Service服務,供遠端合作單位和個人呼叫。
    (藉助一些Web Service框架可以很輕鬆地把自己的業務物件釋出成Web Service服務,Java方面的典型Web Service框架包括:axisxfirecxf等,Java EE伺服器通常也支援釋出Web Service服務,例如JBoss。)

  • 客戶端開發:
    呼叫別人釋出的Web Service服務,大多數人從事的開發都屬於這個方面,例如:呼叫天氣預報Web Service服務。
    (使用廠商的WSDL2Java之類的工具生成靜態呼叫的代理類程式碼;使用廠商提供的客戶端程式設計API類;使用SUN公司早期標準的jax-rpc開發包;使用SUN公司最新標準的jax-ws開發包。當然SUN已被ORACLE收購)

Web Service 工作呼叫原理:

對客戶端而言,我們給這各類Web Service客戶端API傳遞WSDL檔案的url地址,這些API就會建立出底層的代理類,我呼叫這些代理,就可以訪問到Web Service服務。代理類把客戶端的方法呼叫變成SOAP格式的請求資料再通過HTTP協議發出去,並把接收到的SOAP
資料變成返回值返回。對服務端而言,各類Web Service框架的本質就是一個大大的Servlet,當遠端呼叫客戶端給它通過http協議傳送過來SOAP格式的請求資料時,它分析這個資料,就知道要呼叫哪個java類的哪個方法,於是去查詢或建立這個物件,並呼叫其方法,再把方法返回的結果包裝成SOAP格式的資料,通過http響應訊息回給客戶端。


註:以上參考了
維基百科-Web服務
WebService到底是什麼?
Web Services介紹
Web Service 概述