part1. Web Service概述
-----------------------------------------------------
一、 Web Service概述
? 1.動(dòng)機(jī)
???? 1) 今天,萬維網(wǎng)的主要用途是交互式的訪問文檔和應(yīng)用程序;
???? 2) 大多數(shù)時(shí)候,這些訪問是通過瀏覽器、音頻播放器或其它交互式的前-后端系統(tǒng);
???? 3) W3C: “假如萬維網(wǎng)支持應(yīng)用程序間的交互,Web在能力及應(yīng)用范圍上能得到引人注目的增長”
? 2.理念:構(gòu)建應(yīng)用程序的時(shí)候通過發(fā)現(xiàn)以及調(diào)用網(wǎng)絡(luò)上現(xiàn)在的應(yīng)用去實(shí)現(xiàn)某些功能;
二、 技術(shù)基礎(chǔ)
??? Web services = XML + HTTP
??? XML:通用數(shù)據(jù)描述語言;
??? HTTP:被瀏覽器和Web servers廣泛支持的一種傳輸協(xié)議;
三、 What is web service
???? 1) 在互聯(lián)網(wǎng)上,通過基于標(biāo)準(zhǔn)的互聯(lián)網(wǎng)協(xié)議(例如HTTP、SMTP)訪問的一段業(yè)務(wù)邏輯。或者叫Web服務(wù)組件。
???? 2) 承諾在一個(gè)分布式環(huán)境中,不同的平臺(tái)的,不同語言的應(yīng)用和應(yīng)用組件之間能夠互操作。
???? 3) Web service是自我包含、自我描述、模塊化的程序,它能發(fā)布、定位以及通過Web調(diào)用;
???? 4) 一旦一個(gè)web service被布署,其它應(yīng)用程序即可發(fā)現(xiàn)和調(diào)用這個(gè)服務(wù)。
???? 5) 技術(shù)上來說,Web Service也是一種遠(yuǎn)程方法調(diào)用
? 1. 自我包含
???? 1) 在客戶端,無須附加的軟件;
???? 2) 只須XML和HTTP協(xié)議客戶端支持即可開始;
???? 3) 在服務(wù)器端,僅需要一個(gè)Web服務(wù)器和servlet引擎;
???? 4) 對(duì)于Web service使一個(gè)既存的系統(tǒng)重新可用而無須寫一行代碼是可行的;
? 2. 自我描述
???? 1) 無論是客戶端還是服務(wù)器端除了格式和請(qǐng)求內(nèi)容以及響應(yīng)信息外無須關(guān)注任何事情;
???? 2) 信息格式定義通過消息傳輸;
???? 3) 無額外的無素貯藏庫或代碼產(chǎn)生工具需要;
? 3. 模塊化的程序
???? 1) Web services標(biāo)準(zhǔn)框架提供了一個(gè)組件模型;
???? 2) Web services是一種技術(shù),用于部署和提供Web上的商業(yè)功能訪問;
???? 3) J2EE、CORBA和其它標(biāo)準(zhǔn)是實(shí)現(xiàn)這些Web services的技術(shù);
? 4. 發(fā)布、定位以及通過Web調(diào)用所需的一些額外的標(biāo)準(zhǔn):
???? SOAP:Simple Object Access Protocol
????????? 也可理解為 service-oriented architecture protocol,基于RPC和通訊協(xié)議的XML。
???? WSDL:Web Service Description Language, 一個(gè)描述性的接口和協(xié)議綁定語言。
???? UDDI:Universal Description, Discovery and Integration,一種注冊(cè)機(jī)制,用于查找Web service描述。
? 5. 語言無關(guān)和互操作性
???? 1) 客戶端和服務(wù)器端能在不同環(huán)境下被實(shí)現(xiàn);
???? 2) 既存的環(huán)境為了實(shí)現(xiàn) Web service 無須進(jìn)行改動(dòng);
???? 3) 但是在現(xiàn)在,我們假設(shè)Java是Web service客戶端和服務(wù)器端的實(shí)現(xiàn)語言;
? 6. 基于開放的標(biāo)準(zhǔn)
???? 1) XML和HTTP是Web services的技術(shù)基礎(chǔ);
???? 2) 很大部分Web service技術(shù)使用開源項(xiàng)目構(gòu)建;
???? 3) 因此,供應(yīng)商無關(guān)以及互操作性是這時(shí)的現(xiàn)實(shí)目標(biāo)。
? 7. Web services是動(dòng)態(tài)的
???? 通過使用Web Services,動(dòng)態(tài)電子商務(wù)變得很現(xiàn)實(shí)。
???? 因?yàn)椋褂肬DDI和WSDL,Web service描述和發(fā)現(xiàn)可以自動(dòng)進(jìn)行。
? 8. Web services是組合的、簡單的
???? Web services能組合成更復(fù)雜的Web services,無論是使用工作流技術(shù)或是調(diào)用更底層的Web services。
? 9. 基于成熟技術(shù)構(gòu)建
???? 1) XML + HTML
???? 2) 和其它分布式計(jì)算框架相比,有很多相同點(diǎn)也有很多基礎(chǔ)性的不同。
??????? 例如,傳輸協(xié)議基于文本而非二進(jìn)制。
四、 Web Service可以解決的問題
??? 1) 異構(gòu)應(yīng)用系統(tǒng)之間的集成
?????? 異構(gòu)程序定位:使用URI標(biāo)志軟件程序
????????? 傳輸協(xié)議:HTTP、FTP、SMTP等公共協(xié)議???
????????? 數(shù)據(jù)格式:XML
????????? 接口描述:XML
??? 2) 不同公司之間的系統(tǒng)集成
?????? 公共的互聯(lián)網(wǎng)協(xié)議HTTP、FTP、SMTP
??? 3) 需要集成的系統(tǒng)之間有防火墻
?????? 使用公共的網(wǎng)絡(luò)協(xié)議HTTP、FTP、SMTP
????????? 傳統(tǒng)的做法是,選擇用瀏覽器作為客戶端(大量跳轉(zhuǎn)頁面和控制程序)
????????? 新的做法(Ajax,Web Service)
?????? 區(qū)別于web應(yīng)用
????????? web application: 人(瀏覽器)與應(yīng)用的交互
????????? web service:???? 應(yīng)用與應(yīng)用的交互
??? 4) 代碼重用的問題
?????? 使用HTTP等服務(wù),無需下載或安裝服務(wù)程序的代碼
? Web service的好處.
????? 專注于核心商業(yè)邏輯,使用Web service應(yīng)用于非核心商業(yè)邏輯從而以一個(gè)很低的成本快速發(fā)布新的IT解決方案;
????? 通過使用Web service封裝以前軟件系統(tǒng)到當(dāng)前系統(tǒng)中可保護(hù)既有投資;
????? 以最少的費(fèi)用將用戶和伙伴的商業(yè)系統(tǒng)結(jié)合到一塊;
?? 1.好處——促進(jìn)協(xié)同工作能力
???? 1) service provider和service requester之間的溝通設(shè)計(jì)為平臺(tái)和語言無關(guān);
???? 2) 這個(gè)交互需要一份WSDL文檔,這份文檔定義了接口以及描述了相應(yīng)的服務(wù),連同網(wǎng)絡(luò)協(xié)議在一起(通常是HTTP);
?? 2.好處——
???? 1) 當(dāng)service requester 使用service broker尋找service provider,這種發(fā)現(xiàn)是自動(dòng)發(fā)生的。
???? 2) 一旦requester和provider相互找到,provider的WSDL文檔用于將requester和服務(wù)綁定到一塊。
???? 3) 這意味著requester、provider和broker一塊創(chuàng)建的系統(tǒng)是自我設(shè)置、自我適應(yīng)以及強(qiáng)健的。
?? 3.好處——通過封裝降低了復(fù)雜性
???? 1) service requester和provider只關(guān)心必要的接口;
???? 2) service requester并不關(guān)心service provider如何實(shí)現(xiàn)服務(wù);
???? 3) 這些細(xì)節(jié)都在requester和provider方封裝好,這種封裝對(duì)于降低復(fù)雜性非常重要;
?? 4.好處——給遺留系統(tǒng)以新的生機(jī)
???? 1) 對(duì)于一個(gè)遺留系統(tǒng)、產(chǎn)生一個(gè)SOAP包裝,然后產(chǎn)生一個(gè)WSDL文檔將應(yīng)用程序作為一個(gè)web service;
???? 2) 這意味著遺留系統(tǒng)能用于新的方面;
???? 3) 此外,與遺留系統(tǒng)相聯(lián)系的基礎(chǔ)設(shè)施能封裝成一系列的服務(wù);
五、 Web Service的特點(diǎn)
??? 1) 基于XML,異構(gòu)應(yīng)用集成容易
??? 2) 基于消息的(HTTP和SOAP消息)
?????? 松散耦合的(調(diào)用服務(wù)代碼時(shí)無需下載和安裝)
?????? 編程語言獨(dú)立的(使用HTTP等協(xié)議,通信更加簡單,使用XML的數(shù)據(jù)格式,程序更易識(shí)別)
?????? 提供異步和同步的能力(異步功能提高訪問性能)
?????? 能動(dòng)態(tài)裝配和集成(可以使用更多服務(wù))
?????? 通過互聯(lián)網(wǎng)進(jìn)行訪問
??? 3) 基于工業(yè)標(biāo)準(zhǔn)的(W3C的 WSDL, SOAP, UDDI)
六、 Web Service角色
???? 1) service provider 創(chuàng)建web service并發(fā)布它的接口和訪問信息到服務(wù)登記處;
???? 2) service broker?? (也稱為service registry)
??????? 有責(zé)任使Web service接口和實(shí)現(xiàn)訪問信息對(duì)任何潛在的service requestor可用;
???? 3) service requestor
??????? 為了使用Web service,使用各種查找操作在broker登記處定義入口以及綁定到service provider。
??? Service provider子角色
???? 1) WSDL規(guī)范由二部分組成:服務(wù)接口和服務(wù)實(shí)現(xiàn);
???? 2) 服務(wù)接口提供者和服務(wù)實(shí)現(xiàn)者是service provider的子角色;
???? 3) 二個(gè)角色可以,但非必須被同一個(gè)事務(wù)承擔(dān);
七、 Web services架構(gòu)體系
???? 1) 通過 service provider 部署到Web上;
???? 2) 提供的功能使用WSDL描述;
???? 3) service broker 幫助 service provider 和 service requestor 能互相找到對(duì)方;
???? 4) service requestor 使用 UDDI API從service broker 處尋找它所需要的服務(wù);
???? 5) 當(dāng)service broker 返回查找的結(jié)果,service requestor 可使用這些結(jié)果綁定到一個(gè)特定服務(wù);
???? 6) Web service 描述由service provider創(chuàng)建和發(fā)布;
???? 7) 由service broker 組織和查找;
???? ?由service requester 定位和調(diào)用;
八、 Web services組件
??? 前面顯示了Web service中用到的三種主要的組件:
???? 1) Service provider:? 提供服務(wù)并使這些服務(wù)可用;
???? 2) Service broker:??? 為service provider和service requestor配對(duì);
???? 3) Service requester: 使用service broker查找Web service,然后調(diào)用這些服務(wù)去創(chuàng)建應(yīng)用程序;
九、 Web service操作
???? 1) 發(fā)布/取消發(fā)布
??????? 發(fā)布服務(wù)至登記處;
??????? 移除這些登記的條款
??????? service provider聯(lián)系
??????? service broker發(fā)布/取消服務(wù)
???? 2) 查找操作由service requestor和service broker共同完成:
??????? service requestor描述他們查找的服務(wù)種類;
??????? service broker遞交最匹配的請(qǐng)求結(jié)果。
???? 3) 綁定發(fā)生在service requestor和service provider間
??????? 他們會(huì)協(xié)議好以便requestor能訪問和調(diào)用service provider提供的服務(wù)。
六、 SOA架構(gòu)(Service-Oriented Architecture)
??? 面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architecture,SOA)是一個(gè)分布式組件模型,用來將現(xiàn)有的應(yīng)用集成
??? 1) 把組件都看做網(wǎng)絡(luò)服務(wù)
??????? 將現(xiàn)有的應(yīng)用、組件、業(yè)務(wù)邏輯發(fā)布為服務(wù)
??????? 對(duì)服務(wù)的要求:與平臺(tái)無關(guān)(硬件,操作系統(tǒng),語言);基于 internet 的服務(wù),采用公共的網(wǎng)絡(luò)協(xié)議
??? 2) SOA系統(tǒng)原型的一個(gè)典型例子是通用對(duì)象請(qǐng)求代理體系結(jié)構(gòu)
?????? (Common Object Request Broker Architecture,CORBA)
??? 3) 現(xiàn)在的SOA以XML為基礎(chǔ)的,也就是Web Service
?????? Web服務(wù)是技術(shù)規(guī)范,而SOA是設(shè)計(jì)原則,Web服務(wù)是實(shí)現(xiàn)SOA的方式之一
part2. Web Service關(guān)鍵技術(shù)? ----? SOAP協(xié)議
-----------------------------------------------------
一、 What is SOAP(Simple Object Access Protocol) ——簡單對(duì)象訪問協(xié)議
???? 1) SOAP是一個(gè)網(wǎng)絡(luò)中立的、輕量級(jí)的協(xié)議,用于交換兩個(gè)遠(yuǎn)端應(yīng)用程序的信息;
???? 2) SOAP是一個(gè)基于XML的協(xié)議,由三部分組成:
??????? envelope: 定義了一個(gè)框架,該框架用于描述信息內(nèi)容以及處理說明;
??????? 一系列的編碼規(guī)則:用于表現(xiàn)系統(tǒng)定義的數(shù)據(jù)類型實(shí)例;
??????? 一個(gè)協(xié)定:用于表現(xiàn)遠(yuǎn)端處理調(diào)用和響應(yīng)
???? 3) SOAP使用XML技術(shù)定義了一個(gè)可擴(kuò)展的消息框架,底層可以通過各種協(xié)議進(jìn)行數(shù)據(jù)交換(主要HTTP、FTP、SMTP)
???? 4) SOAP定義為與特定的編程模型和實(shí)現(xiàn)語句無關(guān)(只要它能處理XML信息)
??????? 是一個(gè)與協(xié)議無關(guān)的傳輸器, 用和許多協(xié)議共同使用(這里我們描述如何和HTTP一起使用SOAP);
???? 5) SOAP是分布式環(huán)境下交換結(jié)構(gòu)化信息的規(guī)范;
???? 6) SOAP代表了SOA中三種主要行動(dòng)者
??????? (service provider、service requestor、service broker)間主要的溝通方式;
???? 7) 它的設(shè)計(jì)目標(biāo)是應(yīng)該簡單以及可擴(kuò)展;
?? 1.SOAP VS JRMP、IIOP
??????? SOAP:傳遞基于XML的文本數(shù)據(jù)(基于文本的協(xié)議易識(shí)別和理解,例如HTTP)
??????? JRMP、IIOP:傳遞字節(jié)數(shù)據(jù)
?? 2.SOAP1.2 是 W3C 推薦標(biāo)準(zhǔn)
??????? W3C(萬維網(wǎng)聯(lián)盟)組織是一個(gè)制定網(wǎng)絡(luò)標(biāo)準(zhǔn)的非贏利組織,像 HTML、XHTML、CSS、XML 的標(biāo)準(zhǔn)都是由W3C來定制
?? 3.defines1:
??????? SOPA信封????? 定義消息結(jié)構(gòu):一個(gè)信封內(nèi)包含一個(gè)消息頭和一個(gè)消息體
??????? 協(xié)議綁定框架??? 定義了一組規(guī)則把SOAP消息綁定到其他的底層協(xié)議
??????? 參看:http://www.w3.org/TR/soap12-part1/
?? 4.defines2:
??????? Data modle for SOAP
??????????? 定義SOAP消息中的XML數(shù)據(jù),和具體編程實(shí)現(xiàn)的數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系(如:XML轉(zhuǎn)換成Java數(shù)據(jù)類型)
??????? Binding to Http
??????????? 定義了如何將SOPA消息綁定到HTTP協(xié)議
??????? 參看:http://www.w3.org/TR/soap12-part2/
?? 5.需要知道SOAP的細(xì)節(jié)嗎?
???? 需要:了解細(xì)節(jié)有助于你構(gòu)建更好的應(yīng)用(如提高效率和性能:這要求對(duì)XML和底層通信協(xié)議的了解)
???? 無需:一般情況你應(yīng)該使用一些高層的API(如JAX-WS)構(gòu)建應(yīng)用,SOAP的實(shí)現(xiàn)細(xì)節(jié)對(duì)開發(fā)者透明
二、 SOAP信封
??? 1) 一條 SOAP 消息就是一個(gè)普通的 XML 文檔,包含下列元素:
?????? 必需的 Envelope 元素,可把此 XML 文檔標(biāo)識(shí)為一條 SOAP 消息
?????? 可選的 Header 元素,包含頭部信息
?????? 必需的 Body 元素,包含所有的調(diào)用和響應(yīng)信息
???????????? 包含可選的 Fault 元素,提供有關(guān)在處理此消息所發(fā)生錯(cuò)誤的信息
??? 2) 所有以上的元素均被聲明于針對(duì) SOAP 封裝的默認(rèn)命名空間中:
???????? http://www.w3.org/2001/12/soap-envelope
?????? 以及針對(duì) SOAP 編碼和數(shù)據(jù)類型的encodingStyle屬性:
???????? http://www.w3.org/2001/12/soap-encoding
??? 1. SOAP消息 語法規(guī)則:
??????? 必須用 XML 來編碼
??????? 必須使用 SOAP Envelope 命名空間
??????? 必須使用 SOAP Encoding 命名空間
??????? 不能包含 DTD 引用
??????? 不能包含 XML 處理指令
??? 2. SOAP 消息的基本結(jié)構(gòu)
??????? <?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>
三、 信息格式
???? 1) 一個(gè)SOAP信息是一個(gè)envelope,該envelope包含零至多個(gè)header以及一個(gè)body元素;
???? 2) 這個(gè)envelope是XML文檔的根元素;
???? 3) envelope為以下內(nèi)容提供了了一個(gè)容器:
??????? 控制信息; 消息的收件人; 消息本身;
???? 4) header包含控制信息,例如服務(wù)屬性;
???? 5) body包含消息標(biāo)簽以及它的參數(shù);
四、 編碼規(guī)則
???? 1) 編碼規(guī)則定義了一系列機(jī)制用于交換程序自定義數(shù)據(jù)類型的實(shí)例;
???? 2) SOAP基于XML schema描述符(XSD)定義了一個(gè)與編程語言無關(guān)的數(shù)據(jù)類型schema,
??????? 根據(jù)這個(gè)模型為所有定義的數(shù)據(jù)類型加上這個(gè)編碼規(guī)則;
五、 RPC代表
???? 1) RPC代表是適用于表現(xiàn)遠(yuǎn)端過程調(diào)用以及相關(guān)響應(yīng)消息的一個(gè)協(xié)定;
???? 2) 作為遠(yuǎn)端方法中的參數(shù),我們通常使用相關(guān)的簡單數(shù)據(jù)結(jié)構(gòu)。當(dāng)然,也可以傳輸更復(fù)雜的數(shù)據(jù)。
???? 3) 這個(gè)協(xié)定僅被SOAP執(zhí)行,并非SOAP標(biāo)準(zhǔn)的一部分。
???? 4) 這個(gè)轉(zhuǎn)換的使用是可選的,假如沒有使用RPC轉(zhuǎn)換,會(huì)話是純粹面向消息的;
六、 URN
???? 1) URN代表統(tǒng)一資源名稱(unified resource name);
???? 2) URN唯一地識(shí)別給客戶端的服務(wù);
???? 3) 在單個(gè)SOAP服務(wù)器的所有部署的服務(wù)中,它必須是唯一的,通過一個(gè)合適的網(wǎng)絡(luò)地址確定;
???? 4) 一個(gè)URN被編碼為一個(gè)通用資源標(biāo)識(shí)符(URI);
???? 5) 我們通過使用格式:urn:UniqueServiceID
七、 SOAP envelope
???? 1) envelope是表示為下列結(jié)構(gòu)的XML文檔的根元素:?? [message payload]?
???? 2) 一個(gè)SOAP消息有零至多個(gè)header和一個(gè)body;
???? 3) SOAP envelope同樣定義了結(jié)構(gòu)化信息的名域空間;
???? 4) 整個(gè)SOAP消息(header和body)都封裝在envelope內(nèi);
???? 5) 注意消息body使用一個(gè)服務(wù)特定的名域空間,類似于urn:NextMessage;
???? 6) 這個(gè)名域空間不同于SOAP-ENV, 這個(gè)名域空間被envelope所使用,由SOAP規(guī)范所定義;
???? 7) 因此在創(chuàng)建消息體的時(shí)候,這個(gè)應(yīng)用程序能使用它自己的域特定詞匯;
八、 SOAP Header
???? 1) header是envelope中可選的元素,假如出現(xiàn)的話,這個(gè)元素必須是SOAP envelope中第一個(gè)出現(xiàn)的子元素;
???? 2) 所有header元素的子元素稱為header條款;
???? 3) header也能裝載認(rèn)證數(shù)據(jù),數(shù)字簽名,編碼信息以及傳輸設(shè)置;
???? 4) header也能裝載客戶端或項(xiàng)目-指定控制以及協(xié)議的擴(kuò)展;header的定義并不取決于body。
?? 1.可選的,用于擴(kuò)展SOAP消息,例如:
???? 調(diào)用的上下文??????? 目前的應(yīng)用模式基本上停留在遠(yuǎn)程過程/對(duì)象的調(diào)用上,
?????????????????????? 基于多次協(xié)調(diào)調(diào)用或者遵循上下文的調(diào)用模式尚很少使用,這其實(shí)是受簡單的SOAP消息的制約
???? 安全認(rèn)證?????????? 保存用戶標(biāo)識(shí)及密碼信息或者其他鑒定證書???
???? 事務(wù)控制?????????? 利用SOAP Header條目進(jìn)行事務(wù)控制
???? 其他高級(jí)語義功能
?? 2.SOAP Header由一些Header條目組成
????? <env:Header xmlns:env="http://www.w3.org/2001/06/soap-envelope" >
??????? <auth:authentication xmlns:auth="http://example.org/authentication"
???????? env:role="authentication:signin_service"? env:mustUnderstand="1"?? relay=""? >
?????????? <auth:userID>testuserid</auth:userID>
?????????? <auth:password>[encodedPassword]</auth:password>
?????????? <auth:redirection>http://example.com/service/</auth:redirection>
??????? </auth:authentication>
????? </env:Header>
??? 3.role屬性:(next|none|ultimateReceiver)
???????? 指定這個(gè)條目必須被哪種角色處理
??? 4.mustUnderstand:(true|false)
???????? 處理節(jié)點(diǎn)必須被處理,如果處理節(jié)點(diǎn)理解不了,必須返回一個(gè)SOAP Fault. (此時(shí)relay無意義)
??? 5.relay:(true|false)
???????? 處理節(jié)點(diǎn)理解的條目,將會(huì)保留,并轉(zhuǎn)發(fā)給下一個(gè)SOAP節(jié)點(diǎn)處理
九、 SOAP Body
??? 必須的,包含傳遞給最終的節(jié)點(diǎn)的實(shí)際信息
???? 1) SOAP body元素提供了一種機(jī)制用以交換信息;
???? 2) body元素是SOAP envelope元素的下一級(jí)元素;
???? 3) 假如存在header元素,body元素應(yīng)該緊跟header元素之后。否則它應(yīng)該緊跟envelope元素之后。
???? 4) 所有body元素的下一級(jí)子元素稱為body的條目,這些條目各自獨(dú)立;
???? 5) 在大多數(shù)簡單的情況下,基本SOAP消息的body組成:
??????? 一個(gè)消息名稱;
??????? 一個(gè)服務(wù)實(shí)例的引用;
???? 6) 在Apache SOAP中,一個(gè)服務(wù)實(shí)例為它的URN所標(biāo)識(shí)。這個(gè)引用編碼為名域空間的屬性。
???? 7) 一至多個(gè)參數(shù)里裝載著值和可選的類型引用;
????
典型的body元素使用包括用相應(yīng)的參數(shù)調(diào)用RPC、返回結(jié)果及錯(cuò)誤報(bào)告;
???? 9) 消息可以包括幾乎任何XML結(jié)構(gòu),除了DTD及處理說明。
????? <soap:Body xmlns:m="http://www.example.org/stock">
??????? <m:GetStockPrice>
??????????? <m:StockName>IBM</m:StockName>
??????? </m:GetStockPrice>
????? </soap:Body>
十、 SOAP Fault
??? 可選的,元素用于存留 SOAP 消息的錯(cuò)誤和狀態(tài)信息。必須出現(xiàn)在SOAP Body中
??? <soap:Body xmlns:m="http://www.example.org/stock">
??????? <soap:Fault>
??????????? <faultcode>MustUnderstand</faultcode>
??????????? <faultstring>
??????????????? 一個(gè)或多個(gè)必須的soap頭未被理解
??????????? </faultstring>
??????? </soap:Fault
??? </soap:Body>
??? <faultcode> 供識(shí)別故障的代碼
??? <faultstring> 可供人閱讀的有關(guān)故障的說明
??? <faultactor> 有關(guān)是誰引發(fā)故障的信息
??? <detail> 存留涉及 Body 元素的應(yīng)用程序?qū)S缅e(cuò)誤信息
??? faultcode的值:
????? VersionMismatch:?? SOAP Envelope 元素的無效命名空間被發(fā)現(xiàn)
????? MustUnderstand:??? Header 元素的一個(gè)直接子元素(帶有設(shè)置為 "1" 的 mustUnderstand 屬性)無法被理解。
????? Client:??????????? 消息被不正確地構(gòu)成,或包含了不正確的信息。
????? Server:??????????? 服務(wù)器有問題,因此無法處理進(jìn)行下去。
十一、SOAP HTTP Binding
??? HTTP + XML = SOAP
??? SOAP 請(qǐng)求可能是 HTTP POST 或 HTTP GET 請(qǐng)求。
??? HTTP POST 請(qǐng)求規(guī)定至少兩個(gè) HTTP 頭:Content-Type 和 Content-Length。
? 1. SOAP請(qǐng)求
???? POST /soapsamples/servlet/rpcrouter HTTP/1.0
???? Host: localhost
???? Content-Type:
???? text/xml:charset=utf-8
???? Content-Length: 460
???? SOAPAction: ""? IBM?
????? 1) SOAP請(qǐng)求表明getQuote方法從以下地址調(diào)用:http://localhost/soapsamples/servlet/rpcrouter
????? 2) SOAP協(xié)議并沒有指定如何處理請(qǐng)求,服務(wù)提供者可運(yùn)行一個(gè)CGI腳本,調(diào)用servlet或執(zhí)行其它產(chǎn)生對(duì)應(yīng)響應(yīng)的處理;
????? 3) 響應(yīng)包含于一個(gè)XML文檔格式的表單內(nèi),該表單包含了處理的結(jié)果,在我們這個(gè)范例中是IBM的股價(jià);
? 2. SOAP響應(yīng)
???? HTTP/1.1 200 OK
???? Server: IBM HTTP SERVER/1.3.19 Apache/1.3.20 (Win32)
???? Content-Length: 479
???? Connection: close
???? Content-Type: text/xml; charset = utf-8
???? Content-Language: en? 108.53?
???? 1) 結(jié)果所位于的元素名稱在請(qǐng)求方法名后加后綴“Response”,
??????? 例請(qǐng)求方法名為:getQuote, 響應(yīng)方法名為:getQuoteResponse。
? 3. Http響應(yīng)狀態(tài)
???? 1) 1XX——information
???? 2) 2XX——success
???? 3) 3XX——redirection
???? 4) 4XX——client error
???? 5) 5XX——sever error
part3. Web Service關(guān)鍵技術(shù)? ---? WSDL
-----------------------------------------------------
1. What is WSDL(Web Service Description Language) ——Web服務(wù)描述語言
?? WSDL既是機(jī)器可閱讀的,又是人可閱讀的,這將是一個(gè)很大的好處。
?? 一些最新的開發(fā)工具既能根據(jù)你的Web service生成WSDL文檔,又能導(dǎo)入WSDL文檔,生成調(diào)用相應(yīng)Web service的代碼
???? 1) WSDL是以XML為基礎(chǔ)的接口定義語言,它提供了一種分類和描述Web service的方式;
??????? 描述Web服務(wù) 和說明如何與Web服務(wù)通信的XML語言
???? 2) WSDL定義了 Web service的接口,包括:
??????? a. 操作方式(單向、通知、請(qǐng)求-響應(yīng));
??????? b. 定義了Web service的消息;
??????? c. 數(shù)據(jù)類型(XML schema);
?????????? Web service訪問協(xié)議(SOAP over HTTP);
?????????? Web service聯(lián)系的終點(diǎn)(Web service URL);
?????????? 符合要求的服務(wù)端應(yīng)用程序必須支持這些接口,客戶端用戶能從這份文檔中得知如何訪問一個(gè)服務(wù)。
2. WSDL文檔結(jié)構(gòu)
?? <definitions>
?????? <types>??? definition of types........??? </types>
?????? <message>? definition of a message....??? </message>
?????? <portType> definition of a port.......??? </portType> //代表interface:接口
?????? <binding>? definition of a binding....??? </binding>
?????? <service>? service of a binding....?????? </service>
?? </definitions>
?? 總體上可以分為兩大部分:
??? 1)抽象定義
????? 定義要交換的數(shù)據(jù)格式(數(shù)據(jù)類型/參數(shù)/返回值/方法聲明)
????? types????? 定義數(shù)據(jù)類型,使用XML Schema作為類型系統(tǒng)
????? messages?? 定義要交換的數(shù)據(jù),數(shù)據(jù)類型是types中定義的數(shù)據(jù)類型。對(duì)應(yīng)方法的參數(shù)
???????????????? 包括若干個(gè)part,每個(gè)part 都對(duì)應(yīng)types中定義一個(gè)元素。對(duì)應(yīng)方法的一個(gè)參數(shù)
????? porttype(接口) 包含若干 operation;定義一個(gè)服務(wù),對(duì)應(yīng)Java的接口
???????????????? 包含一些operation,operation對(duì)應(yīng)Java的方法
???????????????? operation 都包含一個(gè)input 和 output 消息(messages中定義)
??? 2)具體描述
????? 定義要采用的互操作協(xié)議(soap)、傳輸協(xié)議(http,ftp,smtp 等)、聲明服務(wù)的訪問地址???
????? binding 針對(duì) porttype 定義協(xié)議綁定和數(shù)據(jù)格式的細(xì)節(jié):
????????????? 首先是定義消息風(fēng)格(style) 和 傳輸協(xié)議(transport)
????????????? 然后是對(duì)操作的輸入輸出的 消息編碼方式(use)
????? service 包含若干 port
????????????? port 定義了一個(gè)通信端點(diǎn),代表 binding(不同協(xié)議)到 address 的映射
使用XFire開發(fā)Web Service
??? XFire是一個(gè)開源的Web Service框架
???
??? operation的四種類型:
??????? 單向: 端點(diǎn)接收請(qǐng)求消息
??????? 請(qǐng)求/應(yīng)答: 端點(diǎn)接收請(qǐng)求消息,然后返回一個(gè)響應(yīng)消息
??????? 通知: 斷點(diǎn)發(fā)送一個(gè)消息
??????? 要求/響應(yīng): 端點(diǎn)發(fā)送請(qǐng)求消息,然后接收一個(gè)響應(yīng)消息
??? SOAP的兩種消息風(fēng)格
??????? style=[document|rpc]
??????? document: 客戶端使用 XML 模式調(diào)用約定。優(yōu)點(diǎn):更松散的客戶端和服務(wù)器端耦合性,跨平臺(tái)互操作性更好
?????????? 分兩種: bared(裸露);? wrapped,模擬rpc(包裝的)
??????? rpc:????? 客戶端使用遠(yuǎn)程過程調(diào)用約定。? 優(yōu)點(diǎn):對(duì)開發(fā)人員更加簡單.
??? binding的傳輸協(xié)議
??????? transport="http://schemas.xmlsoap.org/soap/http"
??????? transport="http://schemas.xmlsoap.org/soap/smtp"
??? binding中消息的編碼方式
??????? user=[literal|encoded]
??????? literal: 使用types定義的數(shù)據(jù)類型
??????? encoded: 使用soap定義好的數(shù)據(jù)類型,不能使用自定義數(shù)據(jù)類型
??? 可能的style/user組合
??????? 1. style="rpc" and use="encoded"
??????? 2. style="rpc" and use="literal"
??????? 3. style="document" and use="encoded"
??????? 4. style="document" and use="literal"
??????? 其中WS-I組織只支持(user=literal)格式;(user=encoded不被支持)
??????? WS-I(Web Services Interoperability Organization) Web服務(wù)協(xié)同組織
??????? 盡量使用第4種: style="document" and use="literal"?
???
part4. Web Service關(guān)鍵技術(shù)? ---? UDDI
-----------------------------------------------------
一、 What is UDDI (Universal Description Discovery and Integration)
???? 1) 即統(tǒng)一描述、發(fā)現(xiàn)和集成協(xié)議。
???? 2) UDDI提供了一種發(fā)布和查找Web服務(wù)的方式,使貿(mào)易伙伴彼此發(fā)現(xiàn)對(duì)方和查詢對(duì)方。
???? 3) UDDI提供了一個(gè)全球的、平臺(tái)無關(guān)的、開放式框架,使得商業(yè)應(yīng)用能:
??????? 相互查找;
??????? 定義它們通過Web交互的方式;
??????? 在一個(gè)全球注冊(cè)場所共享信息;
???? 4) 在Web上存在三種開放的UDDI注冊(cè)場所, 由IBM、Microsoft 和HP發(fā)起;
???? 5) 注冊(cè)是免費(fèi)的,在任一注冊(cè)處注冊(cè)的內(nèi)容被其它注冊(cè)處所復(fù)制;
???? 6) 在UDDI商業(yè)注冊(cè)處提供的信息由三部分組成:
??????? “白皮書”:(白頁 White pages)包括地址、聯(lián)系以及標(biāo)識(shí)符、產(chǎn)品信息;
??????? “黃皮書”:(黃頁 Yellow pages)包括基于標(biāo)準(zhǔn)分類學(xué)的各產(chǎn)業(yè)分類;
??????? “綠皮書”:(綠頁 Green pages)所提供的service的詳細(xì)信息;
???? 7) Web service provider 和 requester 使用SOAP API和UDDI注冊(cè)處交流;
預(yù)想的結(jié)構(gòu):發(fā)布者--注冊(cè)服務(wù)--使用者
?? 不是必須的,公共的注冊(cè)服務(wù)目前還沒有被廣泛接受
UDDI的數(shù)據(jù)結(jié)構(gòu)
?? 1. businessEntity. 白頁信息,公司的信息
2. businessService.黃頁信息,Web服務(wù)的分類信息
3. bindingTemplate. 綠頁信息,Web服務(wù)的技術(shù)信息,包括如何調(diào)用Web服務(wù)的信息
4. tModels. 調(diào)用細(xì)節(jié)信息,包含WSDL文檔的引用。
XFire動(dòng)態(tài)客戶端
-----------------------------------------------------
??? 第一步:引入 XFire相關(guān)的類庫
??????? Core Libraries
??????? JAXB Libraries
??????? HTTP Client Libraries
??? 第二步:
??????? Client client = new Client(new URL("WSDL文檔URL"));??????????? //創(chuàng)建一個(gè)動(dòng)態(tài)客戶端
??????? Object[] results = client.invoke("test", new Object[] { "Juliet" });??? //調(diào)用方法
??????? System.out.println( results[0]);
XFire動(dòng)態(tài)客戶端2
Service srvcModel = new ObjectServiceFactory().create(MathService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
// HelloWorld 服務(wù)名稱
String helloWorldURL = "http://localhost:8081/Hello/services/HelloWorld";
IHelloWorld srvc = (IHelloWorld) factory.create(srvcModel, helloWorldURL);
System.out.println("結(jié)果 :" + srvc.example("tarena"));
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
