1. 程式人生 > >web services深入淺出

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)。

 


圖2

 

  • 本地呼叫:通常,在我們的程式碼中呼叫一個函式,這個函式要麼是系統API,要麼是我們自己實現的原生代碼,一起編譯,一起釋出,也在同一個程序中一起執行,這就是本地呼叫!

  • 遠端呼叫:被呼叫方法的具體實現不在同一個程序,而是在別程序,甚至別的電腦上。RPC一個重要思想就是,使遠端呼叫看起來像本地呼叫一樣,呼叫者無需知道被呼叫介面具體在哪臺機器上執行。

3. 遠端呼叫原理

比如 A (client) 呼叫 B (server) 提供的remoteAdd方法:

  1. 首先A與B之間建立連線(通常是TCP,但還有其他的,如HTTP、管道等);
  2. 然後A把需要呼叫的方法名(這裡是remoteAdd)以及方法引數(10, 20)序列化成位元組流傳送出去;
  3. B接受A傳送過來的位元組流,然後反序列化得到方法名,方法引數,接著執行相應的方法呼叫並把結果30返回;
  4. A接受遠端呼叫結果,輸出30。

 


圖3

 

通過上面的簡單闡述,遠端呼叫與socket通訊好像啊,都是遠端通訊,都是C/S模式。他兩者到底有啥區別?

  1. RPC在提供強大的遠端呼叫能力的同時,不損失本地呼叫的語義簡潔性。RPC一個重要思想就是:使遠端呼叫看起來像本地呼叫一樣。

  2. socket是RPC經常採用的通訊手段之一,除了Socket,RPC還有其他的通訊方法,比如:http、作業系統自帶的管道等。

用HTTP協議實現的遠端呼叫,熟悉的人一下子就想到了Web Service。

4. Web Services的簡單理解

 


圖4 

 

我們可以這樣來理解什麼是Web Services,它即是一種網路服務。當你的系統完成一個通用的功能以後,如果你想讓別人使用你的功能的話,那麼你就可以釋出成為Web Services服務,別人就可以通過網路遠端呼叫到你的服務介面。Web Services能夠讓各個系統之間的對接變得:快捷、方便、廉價。

5. Web Services常用的幾種框架

 


圖7

 

實現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基礎之上實現的。

 


圖8 

 

6.2. 如此理解SOAP

淺談 SOAP:http://www.ibm.com/developerworks/cn/xml/x-sisoap/

這篇IBM的文章「淺談 SOAP」寫的很好,值得參考。

以下這張圖是我對SOAP的理解:

 


圖9 

 

SOAP協議 = RPC機制 + HTTP傳輸協議 + XML資料格式

SOAP的兩個主要設計目標是「簡單性」和「可擴充套件性」,SOAP的設計正是圍繞這兩點展開的。

SOAP使用RPC機制,體現了「簡單性」。讓客戶端呼叫Web Service的介面看起來像本地呼叫一樣,確實很簡單。

SOAP 使用 HTTP 傳送 XML,體現了「可擴充套件性」。儘管HTTP 不是有效率的通訊協議,而且 XML 還需要額外的檔案解析(parse),兩者使得交易的速度大大低於其它方案。但是XML 是一個開放、健全、有語義的訊息機制,而 HTTP 成熟、穩定、又能避免許多關於防火牆的問題,從而使SOAP得到了廣泛的應用。

6.3. SOAP的侷限性

SOAP也有一些侷限性,以下場景就不適合 SOAP:

 


圖10

 

  1. 實時資料推送 
    HTTP是短連線的,都是客戶端請求,服務端應答,這種模式導致服務端無法實時推送資料給客戶端,只有像Socket那樣的長連線才能保證實時通訊。

  2. 省流量、高傳輸效率的應用 
    HTTP有包頭,而且XML全部用文字檔案來傳輸資料,效率會比較低,如果你對流量、傳輸效率要求極高,那麼你應該多考慮其它的方式,而不要用 SOAP。

6.4. SOAP協議看起來長這樣

 


圖11 

 

這個一個股票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文件。

 


圖12 

 

什麼是WSDL

 

如果將WSDL語言轉化成C語言,它看起來應該是這樣子:

 


圖13 

 

WSDL語言轉化成C語言

 

我們可以看看完整的WSDL文件長什麼樣子的:

  1. 天氣預報WEB服務的介面說明(WSDL文件)

  2. 手機號歸屬地查詢WEB服務的介面說明(WSDL文件)

  3. ONVIF標準的WEB服務的介面說明(WSDL文件)

如果你是第一次接觸WSDL文件,前兩個的WSDL文件估計你是看不懂(排版亂糟糟),而ONVIF的WSDL文件興許你還能看懂(ONVIF官網的WSDL之所以這麼工整,是因為插入排版的語句)。

7. 總結

回顧下本文的重點:

  1. Web Services是一種網路服務,它對外提供了一系列遠端呼叫介面(RPC),你可以像本地呼叫一樣去呼叫這些遠端呼叫介面。列舉了幾個免費的WEB服務供大家體驗。

  2. Web Services常用的框架有多種,ONVIF標準中的Web Service採用的是SOAP方式。

  3. WSDL文件是採用SOAP方式實現的Web Services的介面描述文件,就像動態庫的.h檔案一樣。同時也展示了WSDL語言轉化為C語言的對比效果。

看完這些,你或許有疑問,Web Services包含了SOAP、HTTP、XML,RPC、WSDL,辣麼多東東,全部要自己碼程式碼實現嗎?當然不用,我們不必自己造輪子,有現成的工具會幫我們自動生產大部分的程式碼框架,如gSOAP工具,這將是下一篇文章要介紹的內容。