1. 程式人生 > >c++ web service(一)

c++ web service(一)

web service  

1.簡介

  web service 可以為應用程式提供web介面,利用web service ,可以讓你的程式通過網際網路遠端呼叫和控制,非常有用。不同系統,不同機器之間的程式,無須通過第三方,利用web service 即可進行交換資料。例如,支付寶並沒有你銀行卡具體的資訊,但通過銀行提供的介面,支付寶就能獲得資料。天氣預報,匯率轉換等服務都是通過web  service 實現不同系統,不同機器上獲取。

  web service實質就是實現應用程式之間通訊,有兩種應用程式通訊的方法:

    1.RPC  遠端呼叫。在客戶端,RPC的通常方式是:例項化一個遠端物件,並呼叫其方法和屬性。

    2.訊息傳遞。 

  Web service 就是一個應用程式,它向外界暴露出一個能夠通過Web進行呼叫的API。這就是說,你能夠用程式設計的方法通過Web來呼叫這個應用程式。我們把呼叫這個Web service 的應用程式叫做客戶。

2.構成

  web service三大核心技術

  2.1 XML 

    XML和HTML在形式上是一樣的,但本質上確實不同的,XML是用來傳輸資料的,HTML是用來顯示資料的。HTML的標籤是預定義,而XML標籤是自己定義的。

    XML主要的構成是根元素和子元素。且必須前後對應,屬性值必須用雙引號或者單引號括起來。形式如下:

    

<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from> 
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

    XML的特性:1.具有自我描述性。2.可以在不中斷應用程式的情況下進行擴充套件。

    

  2.2SOAP

    簡易物件訪問協議。SOAP是一種簡單的基於XML的協議,它使應用程式通過HTTP來交換資訊。用於應用程式之間的通訊,獨立於平臺。可以繞過防火牆來進行通訊。

    一條SOAP訊息就是一個普通的XML文件。所有構成元素均被聲明於針對 SOAP 封裝的預設名稱空間中:

    http://www.w3.org/2001/12/soap-envelope

    以及針對 SOAP 編碼和資料型別的預設名稱空間:

    http://www.w3.org/2001/12/soap-encoding

    包含下列元素:

      2.2.1.Envelope元素,把XML文件標識為一條SOAP訊息。

        必須要有的元素,是SOAP 訊息的根元素。包含兩個屬性:

          2.2.1.1 xlmns:soap。名稱空間。這個屬性值必須是 "http://www.w3.org/2001/12/soap-envelope"。因為SOAP必須擁有與此名稱空間相關聯的一個Envelope元素。

          2.2.1.2 encodingStyle。用於定義在文件中使用的資料型別。此屬性可出現在任何 SOAP 元素中,並會被應用到元素的內容及元素的所有子元素上。SOAP 訊息沒有預設的編碼方式。

      2.2.2.Header元素。包含頭部資訊。

        這個元素是可選的,包含一些頭部資訊。包含有關 SOAP 訊息的應用程式專用資訊(比如認證、支付等)。如果 Header 元素被提供,則它必須是 Envelope 元素的第一個子元素。

        有三個重要的屬性:

          2.2.2.1: mustUnderstand 。SOAP 的 mustUnderstand 屬性可用於標識標題項對於要對其進行處理的接收者來說是強制的還是可選的。假如您向 Header 元素的某個子元素添加了 "mustUnderstand="1",則它可指示處理此頭部的接收者必須認可此元素。假如此接收者無法認可此元素,則在處理此頭部時必須失效。

          2.2.2.2:actor。用於將 Header 元素定址到一個特定的端點。

          2.2.2.3:encodingStyle。

      2.2.3.Body元素,包含所有呼叫和響應資訊。

        必須要有的元素,包含實際的SOAP訊息。

      2.2.4.Fault元素,提供有關在處理此訊息所發生錯誤的資訊。

        可選的元素,用於存留SOAP訊息的錯誤和狀態資訊。如果已提供了 Fault 元素,則它必須是 Body 元素的子元素。在一條 SOAP 訊息中,Fault 元素只能出現一次。

    基本結構如下:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

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

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

</soap:Envelope> 

   SOAP 是一個基於類物件的傳輸協議。主要包含以下四個部分:

    1.封裝。它定義了一個框架 , 該框架描述了訊息中的內容是什麼,誰應當處理它以及它是可選的還是必須的。

    2.編碼規則。它定義了一種序列化的機制,用於交換應用程式所定義的資料型別的例項。

      序列化:序列化是指將資料從有結構清晰的語言定義的資料形式轉化為二進位制字串,反序列化則是序列化的逆操作。

    3.RPC 表示。它定義了用於表示遠端過程呼叫和應答的協定。

    4.繫結。定義了一種使用底層傳輸協議來完成在節點間交換SOAP封裝的約定。

  2.3 WSDL

  網路服務描述語言,基於XML。用於描述web service以及如何對它們進行訪問。

  WSDL文件是利用這些主要的元素來描述某個 web service的:

    2.3.1 portType 。web service執行的操作。類比c++一個函式庫。是WSDL 埠。特定埠型別的具體協議和資料格式規範。有四種操作型別。

One-way 此操作可接受訊息,但不會返回響應。
Request-response 此操作可接受一個請求並會返回一個響應
Solicit-response 此操作可傳送一個請求,並會等待一個響應。
Notification 此操作可傳送一條訊息,但不會等待響應。

      一個 request-response 操作的例子:

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

      portType中name 屬性:定義了一個埠。

      operation 元素定義了每個埠提供的操作符。name屬性 定義一個操作。具體意義如下:定義了一個名為“getTerm”的操作。"getTerm" 操作會請求一個名為 "getTermRequest" 的輸入訊息,此訊息帶有一個名為 "term" 的引數,並將返回一個名為 "getTermResponse" 的輸出訊息,此訊息帶有一個名為 "value" 的引數。

  

    2.3.2 message。 web service使用的訊息。類比函式呼叫的引數。它由一個或者多個 part 組成。Part:訊息引數

    2.3.3 types 。 web service使用的資料型別。 為了實現平臺無關性,使用 XML Schema語法來定義資料型別。

    2.3.4 binding。 web service 使用的通訊協議。一個例項如下:

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

<binding type="glossaryTerms" name="b1">
   <soap:binding style="document"
   transport="http://schemas.xmlsoap.org/soap/http" />
   <operation>
     <soap:operation soapAction="http://example.com/getTerm"/>
     <input><soap:body use="literal"/></input>
     <output><soap:body use="literal"/></output>
  </operation>
</binding> 

  

    binding 元素有兩個屬性 - name 屬性和 type 屬性。name 屬性定義 binding 的名稱,而 type 屬性指向用於 binding 的埠,在這個例子中是 "glossaryTerms" 埠。

    soap:binding 元素有兩個屬性 - style 屬性和 transport 屬性。style 屬性可取值 "rpc" 或 "document"。在這個例子中我們使用 document。transport 屬性定義了要使用的 SOAP 協議。在這個例子中我們使用 HTTP。

    2.3.5  WSDL UDDI

      UDDI是一種目錄服務,企業可以使用它對web service 進行註冊和搜尋。UDDI,英文為 "Universal Description, Discovery and Integration",可譯為"通用描述、發現與整合服務"。

      UDDI,英文為 "Universal Description, Discovery and Integration",可譯為"通用描述、發現與整合服務"。

      UDDI是一種目錄,這個目錄用於儲存有關 web  service資訊。

      例子:假如行業釋出了一個用於航班比率檢測和預訂的 UDDI 標準,航空公司就可以把它們的服務註冊到一個 UDDI 目錄中。然後旅行社就能夠搜尋這個 UDDI 目錄以找到航空公司預訂介面。當此介面被找到後,旅行社就能夠立即與此服務進行通訊。