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 目錄以找到航空公司預訂界面。當此界面被找到后,旅行社就能夠立即與此服務進行通信。