web services深入淺出
原文連結點選開啟連結
寫的很好,轉來記錄
1. 適合讀者
ONVIF規範中裝置管理和控制部分所定義的介面均以Web Services的形式提供。要理解什麼是ONVIF,就必須先知道什麼是Web Services 。Web Services初學者,往往會被諸如WSDL、SOAP、HTTP、XML等概念搞得暈頭轉向。往往也會發出這樣的疑問:要勝任ONVIF協議網路攝像機(IPC)客戶端程式開發,對Web Services的掌握要到什麼程度?我現在就消除你的疑惑,你只要知道皮毛就夠了,這得益於諸如gSOAP這樣現成的工具,避免了我們「自己造輪子」。
2. 遠端呼叫
函式介面呼叫方式分為:
- 本地呼叫(Local Procedure Call,簡稱LPC)。
- 遠端呼叫(Remote Procedure Call,簡稱RPC)。
-
本地呼叫:通常,在我們的程式碼中呼叫一個函式,這個函式要麼是系統API,要麼是我們自己實現的原生代碼,一起編譯,一起釋出,也在同一個程序中一起執行,這就是本地呼叫!
-
遠端呼叫:被呼叫方法的具體實現不在同一個程序,而是在別程序,甚至別的電腦上。RPC一個重要思想就是,使遠端呼叫看起來像本地呼叫一樣,呼叫者無需知道被呼叫介面具體在哪臺機器上執行。
3. 遠端呼叫原理
比如 A (client) 呼叫 B (server) 提供的remoteAdd方法:
- 首先A與B之間建立連線(通常是TCP,但還有其他的,如HTTP、管道等);
- 然後A把需要呼叫的方法名(這裡是remoteAdd)以及方法引數(10, 20)序列化成位元組流傳送出去;
- B接受A傳送過來的位元組流,然後反序列化得到方法名,方法引數,接著執行相應的方法呼叫並把結果30返回;
- A接受遠端呼叫結果,輸出30。
通過上面的簡單闡述,遠端呼叫與socket通訊好像啊,都是遠端通訊,都是C/S模式。他兩者到底有啥區別?
-
RPC在提供強大的遠端呼叫能力的同時,不損失本地呼叫的語義簡潔性。RPC一個重要思想就是:使遠端呼叫看起來像本地呼叫一樣。
-
socket是RPC經常採用的通訊手段之一,除了Socket,RPC還有其他的通訊方法,比如:http、作業系統自帶的管道等。
用HTTP協議實現的遠端呼叫,熟悉的人一下子就想到了Web Service。
4. Web Services的簡單理解
我們可以這樣來理解什麼是Web Services,它即是一種網路服務。當你的系統完成一個通用的功能以後,如果你想讓別人使用你的功能的話,那麼你就可以釋出成為Web Services服務,別人就可以通過網路遠端呼叫到你的服務介面。Web Services能夠讓各個系統之間的對接變得:快捷、方便、廉價。
5. Web Services常用的幾種框架
實現Web Services的幾種方式
實現Web Services常用的框架有:REST、SOAP、JavaScript、XML-PRC等。這些看不懂,沒關係,大家知道一個事情即可:實現Web Services的方式有好幾種,
我們的主角ONVIF標準中的Web Service採用的是SOAP方式,接下來我們來了解下SOAP。
6. SOAP簡介
6.1. 在TCP/IP四層模型中展示SOAP
SOAP(Simple Object Access Protoco,簡單物件訪問協議),是TCP/IP協議體系中的一個應用層協議,它是在HTTP基礎之上實現的。
6.2. 如此理解SOAP
淺談 SOAP:http://www.ibm.com/developerworks/cn/xml/x-sisoap/
這篇IBM的文章「淺談 SOAP」寫的很好,值得參考。
以下這張圖是我對SOAP的理解:
SOAP協議 = RPC機制 + HTTP傳輸協議 + XML資料格式
SOAP的兩個主要設計目標是「簡單性」和「可擴充套件性」,SOAP的設計正是圍繞這兩點展開的。
SOAP使用RPC機制,體現了「簡單性」。讓客戶端呼叫Web Service的介面看起來像本地呼叫一樣,確實很簡單。
SOAP 使用 HTTP 傳送 XML,體現了「可擴充套件性」。儘管HTTP 不是有效率的通訊協議,而且 XML 還需要額外的檔案解析(parse),兩者使得交易的速度大大低於其它方案。但是XML 是一個開放、健全、有語義的訊息機制,而 HTTP 成熟、穩定、又能避免許多關於防火牆的問題,從而使SOAP得到了廣泛的應用。
6.3. SOAP的侷限性
SOAP也有一些侷限性,以下場景就不適合 SOAP:
-
實時資料推送
HTTP是短連線的,都是客戶端請求,服務端應答,這種模式導致服務端無法實時推送資料給客戶端,只有像Socket那樣的長連線才能保證實時通訊。 -
省流量、高傳輸效率的應用
HTTP有包頭,而且XML全部用文字檔案來傳輸資料,效率會比較低,如果你對流量、傳輸效率要求極高,那麼你應該多考慮其它的方式,而不要用 SOAP。
6.4. SOAP協議看起來長這樣
這個一個股票Web Services服務系統,其中GetStockPrice介面適用於查詢股票當前價格,圖中查詢了IBM的股票價格,Web Services返回股票價格為34.5
6.5. WSDL文件
對於一個Web Services,我們如何知道它對外提供了多少個介面,以及每個介面是如何呼叫的,這就涉及到WSDL(Web Services Description Language,網路服務描述語言)。
注意:只有SOAP方式實現的Web Services才有WSDL文件,其他方式實現的Web Services並沒有WSDL文件。
我們可以這麼理解WSDL:WSDL是一個使用XML語言書寫的文件,這個文件描述了Web Services對外提供了哪些介面,就像動態庫的.h檔案一樣。每個Web Services都有對應的WSDL文件。
什麼是WSDL
如果將WSDL語言轉化成C語言,它看起來應該是這樣子:
WSDL語言轉化成C語言
我們可以看看完整的WSDL文件長什麼樣子的:
如果你是第一次接觸WSDL文件,前兩個的WSDL文件估計你是看不懂(排版亂糟糟),而ONVIF的WSDL文件興許你還能看懂(ONVIF官網的WSDL之所以這麼工整,是因為插入排版的語句)。
7. 總結
回顧下本文的重點:
-
Web Services是一種網路服務,它對外提供了一系列遠端呼叫介面(RPC),你可以像本地呼叫一樣去呼叫這些遠端呼叫介面。列舉了幾個免費的WEB服務供大家體驗。
-
Web Services常用的框架有多種,ONVIF標準中的Web Service採用的是SOAP方式。
-
WSDL文件是採用SOAP方式實現的Web Services的介面描述文件,就像動態庫的.h檔案一樣。同時也展示了WSDL語言轉化為C語言的對比效果。
看完這些,你或許有疑問,Web Services包含了SOAP、HTTP、XML,RPC、WSDL,辣麼多東東,全部要自己碼程式碼實現嗎?當然不用,我們不必自己造輪子,有現成的工具會幫我們自動生產大部分的程式碼框架,如gSOAP工具,這將是下一篇文章要介紹的內容。