WebService教程詳解(一)
Web Services 可以將應(yīng)用程序轉(zhuǎn)換為網(wǎng)絡(luò)應(yīng)用程序。
通過使用 Web Services,您的應(yīng)用程序可以向全世界發(fā)布信息,或提供某項功能。
Web Services 可以被其他應(yīng)用程序使用。
通過 Web Services,您的會計部門的 Win 2k 服務(wù)器可以與 IT 供應(yīng)商的 UNIX 服務(wù)器相連接。
基本的 Web Services 平臺是 XML+HTTP。
Web services 使用 XML 來編解碼數(shù)據(jù),并使用 SOAP 來傳輸數(shù)據(jù)。
什么是webService
WebService,顧名思義就是基于Web的服務(wù)。它使用Web(HTTP)方式,接收和響應(yīng)外部系統(tǒng)的某種請求。從而實現(xiàn)遠程調(diào)用.
1:從WebService的工作模式上理解的話,它跟普通的Web程序(比如ASP、JSP等)并沒有本質(zhì)的區(qū)別,都是基于HTTP傳輸協(xié)議的程序。
2:WebService所使用的數(shù)據(jù)均是基于XML格式的。目前標準的WebService在數(shù)據(jù)格式上主要采用SOAP協(xié)議。SOAP協(xié)議實際上就是一種基于XML編碼規(guī)范的文本協(xié)議。
webService的技術(shù)支持
Web Service平臺需要一套協(xié)議來實現(xiàn)分布式應(yīng)用程序的創(chuàng)建。任何平臺都有它的數(shù)據(jù)表示方法和類型系統(tǒng)。要實現(xiàn)互操作性,Web Service平臺必須提供一套標準的類型系統(tǒng),用于溝通不同平臺、編程語言和組件模型中的不同類型系統(tǒng)。目前這些協(xié)議有:
XML和XSD
可擴展的標記語言XML 是Web Service平臺中表示數(shù)據(jù)的基本格式。除了易于建立和易于分析外,XML主要的優(yōu)點在于它既與平臺無關(guān),又與廠商無關(guān)。XML是由萬維網(wǎng)協(xié)會(W3C)創(chuàng)建,W3C制定的XML SchemaXSD 定義了一套標準的數(shù)據(jù)類型,并給出了一種語言來擴展這套數(shù)據(jù)類型。
Web Service平臺是用XSD來作為數(shù)據(jù)類型系統(tǒng)的。當你用某種語言如VB. NET或C# 來構(gòu)造一個Web Service時,為了符合Web Service標準,所有你使用的數(shù)據(jù)類型都必須被轉(zhuǎn)換為XSD類型。如想讓它使用在不同平臺和不同軟件的不同組織間傳遞,還需要用某種東西將它包裝起來。這種東西就是一種協(xié)議,如 SOAP。
SOAP
SOAP即簡單對象訪問協(xié)議(Simple Object Access Protocal),它是用于交換XML編碼信息的輕量級協(xié)議。它有三個主要方面:XML-envelope為描述信息內(nèi)容和如何處理內(nèi)容定義了框架,將程序?qū)ο缶幋a成為XML對象的規(guī)則,執(zhí)行遠程過程調(diào)用(RPC)的約定。SOAP可以運行在任何其他傳輸協(xié)議上。例如,你可以使用 SMTP,即因特網(wǎng)電子郵件協(xié)議來傳遞SOAP消息,這可是很有誘惑力的。在傳輸層之間的頭是不同的,但XML有效負載保持相同。
Web Service 希望實現(xiàn)不同的系統(tǒng)之間能夠用“軟件-軟件對話”的方式相互調(diào)用,打破了軟件應(yīng)用、網(wǎng)站和各種設(shè)備之間的格格不入的狀態(tài),實現(xiàn)“基于Web無縫集成”的目標。
WSDL
Web Service描述語言WSDL 就是用機器能閱讀的方式提供的一個正式描述文檔而基于XML的語言,用于描述Web Service及其函數(shù)、參數(shù)和返回值。因為是基于XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的。
UDDI
UDDI 的目的是為電子商務(wù)建立標準;UDDI是一套基于Web的、分布式的、為Web Service提供的、信息注冊中心的實現(xiàn)標準規(guī)范,同時也包含一組使企業(yè)能將自身提供的Web Service注冊,以使別的企業(yè)能夠發(fā)現(xiàn)的訪問協(xié)議的實現(xiàn)標準。 調(diào)用RPC與消息傳遞
Web Service本身其實是在實現(xiàn)應(yīng)用程序間的通信。我們現(xiàn)在有兩種應(yīng)用程序通信的方法:RPC遠程過程調(diào)用 和消息傳遞。使用RPC的時候,客戶端的概念是調(diào)用服務(wù)器上的遠程過程,通常方式為實例化一個遠程對象并調(diào)用其方法和屬性。RPC系統(tǒng)試圖達到一種位置上的透明性:服務(wù)器暴露出遠程對象的接口,而客戶端就好像在本地使用的這些對象的接口一樣,這樣就隱藏了底層的信息,客戶端也就根本不需要知道對象是在哪臺機器上。
如何發(fā)布一個WebService?
1、用Jdk1.6.0_21以后的版本發(fā)布一個WebService服務(wù).并通過地址欄查看它的wsdl文檔.
2、通過wsimport生成客戶端代碼,調(diào)用并查看運行的結(jié)果.(學(xué)會如何調(diào)用是我們的重點).
需要注意的是,jdk1.6._07以后jdk版本發(fā)布WebService時必須要完整的對代碼進行注解,如果使用的是jdk1.6.0_21以后版本,因為它已經(jīng)內(nèi)含了ws2.1所以,可以只對類添加@WebService的注解.
以下是兩段不同的代碼:
在jdk1.6.0_13的版本上發(fā)布的ws:
package com.itcast; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; import javax.xml.ws.Endpoint; @WebService(targetNamespace="http://loalhost:9999/helloworld") @SOAPBinding(style=Style.RPC)//只支持RPC的消息風格 public class HelloWorld { //以下通過@WebMethod注解,對外公開方法 @WebMethod public String sayHello(){ return "HelloWorld"; } public static void main(String[] args) { Endpoint.publish("http://localhost:9999/helloworld",new HelloWorld()); } }
2:以下是在jdk1.6.0_24上發(fā)布的WebService代碼:
package com.itcast; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService//注意只有此一個注解,此注解也是必須的,默認的SOAP消息風格為:DOCUMENT public class HelloWorld { public String sayHello(){ return "HelloWorld"; } public static void main(String[] args) { Endpoint.publish("http://localhost:9999/helloworld",new HelloWorld()); } }
第一個WebService服務(wù)
package com.itcast; import javax.jws.WebService; import javax.xml.ws.Endpoint; /** * 第一個WebService服務(wù)應(yīng)用 */ //通過注解,標明此類發(fā)布為一個WebService @WebService public class HelloWorld { public String sayHello(){ return "Hello World"; } //在main方法中,使用javax.xml.ws.Endpoint端點發(fā)布一個應(yīng)用 public static void main(String[] args) { Endpoint.publish("http://127.0.0.1:9999/helloworld", new HelloWorld()); } }
代碼說明:HelloWorld類的所有非靜態(tài)公開方法將對外部暴露.
Wsimport工具說明:
wsimport是jdk自帶的,可以根據(jù)wsdl文檔生成客戶端調(diào)用代碼的工具.當然,無論服務(wù)器端的WebService是用什么語言寫的,都將在客戶端生成Java代碼.服務(wù)器端用什么寫的并不重要.
wsimport.exe位于JAVA_HOME\bin目錄下.
常用參數(shù)為:
• -d<目錄> - 將生成.class文件。默認參數(shù)。
• -s<目錄> - 將生成.java文件。
• -p<生成的新包名> -將生成的類,放于指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必須的參數(shù)
使用:
1:可以通過java –version檢查你當前的版本號.如果版本太低可以安裝高版本的jdk.
或直接將別人已安裝好的jdk目錄拷貝到你的機器如D:\jdk1.6.0_24目錄下.
因為以前的環(huán)境變量已經(jīng)設(shè)置成以前老版本的jdk目錄,即JAVA_HOME和PATH兩個環(huán)境變量.
可以再重新設(shè)置一下環(huán)境變量為:JAVA_HOME=D:\jdk1.6.0_24,path=%JAVA_HOME%\bin,
重新設(shè)置了環(huán)境變量后,要重新打開一個doc(命令行)窗口.才生效.
如果不想修改原來已經(jīng)配置好的環(huán)境變量,可以命令行窗口輸入以下命令,使jdk1.6.0_24生效:
set path = D:\jdk1.6.0_24\bin;%PATH%(回車即可)
再通過java –version查看jdk的版本號是否已經(jīng)發(fā)生變化.
2:轉(zhuǎn)到一個相對干凈的目錄下,我在d盤上新建立一個目錄名為:ws,并轉(zhuǎn)到此目錄下.
3:開啟你的webService.
4:輸入以下命令:
wsimport –s . http://127.0.0.1:9999/helloworld?wsdl
參數(shù)說明:-s是指編譯出源代碼文件,后面的.(點)指將代碼放到當前目錄下.
最后面的http….是指獲取wsdl說明書的地址.
5:此時,將生成.java文件和.class文件.(都包含原始包名).將代碼Copy到你的項目中.(只拷貝java文件)
6:在新的項目中,新一個類,(可位于任意包下),對上面生成的代碼進行調(diào)用,見下一頁ppt.
7:wsimport其他參數(shù)說明,我們經(jīng)常使用的參數(shù)為-d,-s,-p
-d<目錄>將會生成.class文件.
示例:wsimport –d . http://127.0.0.1:9999/helloworld?wsdl
-s<目錄>將會生成.java文件.
示例:wsimport –s . http://127.0.0.1:9999/helloworld?wsdl
-p<包名>將生成的文件(.java或是.class修改成指定的包名)
示例:wsimport -s . -p com.beijing.itcast http://127.0.0.1:9999/helloworld?wsdl
對于-p參數(shù),注意包名的修改,它將所生成類,全部置于通過-p指定的包下.(演示)
需要說明的是,當僅使用-p參數(shù)時,它也將同時使用-d即編譯成.class文件. –d參數(shù)寫或不寫,它都在那里,不離不棄.
RunMain.java的源代碼如下:
package com.leaf; import com.itcast.HelloWorld; import com.itcast.HelloWorldService; /** * 通過調(diào)用生成的類,來調(diào)用遠程代碼 */ public class RunMain { public static void main(String[] args) { //從HelloWorldSerice的getHelloWorldPort方法中返回調(diào)用接口 HelloWorld helloWorld = new HelloWorldService().getHelloWorldPort(); String str = helloWorld.sayHello(); //執(zhí)行調(diào)用 System.err.println(str);//返回HelloWorld字符串 } }
WebService與普通Web程序的區(qū)別
1、 WebService只采用HTTP POST方式傳輸數(shù)據(jù),不使用GET方式;
1) Tttp post的contentType為
(1)application/x-www-form-urlencoded
2) WebService的contentType為
(2) Text/xml soap1.1
(3) application/soap+xml –soap1.2
2、WebService從數(shù)據(jù)傳輸格式上作了限定。
WebService所使用的數(shù)據(jù)均是基于XML格式的。目前標準的WebService在數(shù)據(jù)格式上主要采用SOAP協(xié)議。SOAP協(xié)議實際上就是一種基于XML編碼規(guī)范的文本協(xié)議。
WebService和web服務(wù)器的區(qū)別:
我們可以把WebService看作是Web服務(wù)器上應(yīng)用;反過來說,Web服務(wù)器是WebService運行時所必需的容器。這就是它們的區(qū)別和聯(lián)系。
WebService的特點:
1、 WebService通過HTTP POST方式接受客戶的請求
2、 WebService與客戶端之間一般使用SOAP協(xié)議傳輸XML數(shù)據(jù).
3、它本身就是為了跨平臺或跨語言而設(shè)計的。
- jQuery調(diào)用WebService的實現(xiàn)代碼
- php如何調(diào)用webservice應(yīng)用介紹
- C#發(fā)送HttpPost請求來調(diào)用WebService的方法
- PHP中如何調(diào)用webservice的實例參考
- 解析利用wsdl.exe生成webservice代理類的詳解
- 深入.net調(diào)用webservice的總結(jié)分析
- c#動態(tài)調(diào)用Webservice的兩種方法實例
- PHP使用SOAP調(diào)用.net的WebService數(shù)據(jù)
- 利用soaplib搭建webservice詳細步驟和實例代碼
相關(guān)文章
java文件操作工具類實現(xiàn)復(fù)制文件和文件合并
這篇文章主要介紹了java文件操作工具類,類實現(xiàn)了復(fù)制文件和文件合并的功能,需要的朋友可以參考下2014-03-03SpringBoot超詳細講解集成Flink的部署與打包方法
昨天折騰了下SpringBoot與Flink集成,實際上集成特簡單,主要是部署打包的問題折騰了不少時間。想打出的包直接可以java -jar運行,同時也可以flink run運行,或者在flink的dashboard上上傳點擊啟動。結(jié)果是不行,但是使用不同的插件打包還是可以的2022-05-05springboot mybatis里localdatetime序列化問題的解決
這篇文章主要介紹了springboot mybatis里localdatetime序列化問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10SpringBoot通過@Value實現(xiàn)給靜態(tài)變量注入值詳解
這篇文章主要介紹了springboot如何通過@Value給靜態(tài)變量注入值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07