日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebService初入

發布時間:2024/7/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebService初入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

WebService

1. WebService基本認識

WebService最早是微軟提出了一種以XML為載體網絡信息傳輸的規范,現在幾乎所有的語言與平臺都支持,帶有狀態機制,不依賴于容器,可以發送一個xml作為其請求內容.

WebService通常是基于http的遠程方法調用(RMI),號稱是可以返回遠程對象,一般來說客戶端可以象調用本地方法一樣調用WebService的方法。

在各種各樣的對 WebService的解釋版本中, 足夠官方, 卻并沒有太大幫助, 在我理解, WebService 是一種應用程序組件, 提供一個接口, client端 提供參數, 通過多種方式發起請求,獲取到相應的返回值, 可以通過WebService進行網絡通信, 同時可以實現不同平臺間的數據共享, 僅此而已.

參考鏈接:WebService的兩種方式SOAP和REST比較 (轉)

不過需要注意的一點是,WebService有兩種方式:

  • SOAP協議方式, 三要素為 SOAP, WSDL, UDDI
  • REST方式
  • 1.1 SOAP概述

    SOAP(Simple Object Access Protocol), 簡單對象訪問協議.

    簡單對象訪問協議是交換數據的一種協議規范,是一種輕量的、簡單的、基于XML(標準通用標記語言下的一個子集)的協議,它被設計成在WEB上交換結構化的和固化的信息。

    SOAP的概念理解:

    SOAP消息基本上是從發送端到接收端的單向傳輸,但它們常常結合起來執行類似于請求 / 應答的模式。所有的 SOAP消息都使用 XML 編碼。一條 SOAP消息就是一個包含有一個必需的 SOAP 的封裝包,一個可選的 SOAP 標頭和一個必需的 SOAP 體塊的 XML 文檔。

    具體表現如下:

    <!-- 在SOAP的XML消息中,強制使用的 SOAP 的 Envelope 元素是 SOAP 消息的根元素。 --> <!-- 且SOAP命名空間的使用中, 值始終應為xmlns:soap=http://www.w3.org/2001/12/soap-envelope--> <?xml version="1.0"?><!-- 下面便是SOAP封裝包, 將對應的XML消息封裝至 soap 命名空間 --> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> ... Message information goes here ... </soap:Envelope><!--可選的SOAP頭--> <!--可選的 SOAP Header 元素可包含有關 SOAP 消息的應用程序專用信息(比如認證、支付等)。如果 Header 元素被提供,則它必須是 Envelope 元素的第一個子元素。--><soap:Header> <m:Trans xmlns:m="http://www.w3school.com.cn/transaction/" soap:mustUnderstand="1">234</m:Trans> </soap:Header><!--必需的 SOAP Body,可包含打算傳送到消息最終端點的實際 SOAP 消息。--> <soap:Body> <m:GetPrice xmlns:m="http://www.w3school.com.cn/prices"><m:Item>Apples</m:Item> </m:GetPrice> </soap:Body>

    除此之外, 還有 SOAP Fault元素,用于指示錯誤消息,

    <!--實例--> <!--SOAP請求--> POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn<?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:Body xmlns:m="http://www.example.org/stock"><m:GetStockPrice><m:StockName>IBM</m:StockName></m:GetStockPrice> </soap:Body></soap:Envelope><!--SOAP響應--> HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn<?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:Body xmlns:m="http://www.example.org/stock"><m:GetStockPriceResponse><m:Price>34.5</m:Price></m:GetStockPriceResponse> </soap:Body> </soap:Envelope>

    SOAP 通訊協議使用 HTTP 來發送XML 格式的信息,SOAP 把 XML 的使用代碼化為請求和響應參數編碼模式, 并用HTTP 作傳輸。

    具體地講, 一個SOAP 方法可以簡單地看作遵循SOAP編碼規則的HTTP請求和響應, 一個 SOAP終端則可以看作一個基于HTTP 的URL, 它用來識別方法調用的目標。


    在我目前的理解中, SOAP可以概括為以下要點:

    SOAP消息用XML進行編碼, 同時擁有相匹配的編碼規則, 便于通信, 解析, 交互;

    同時在HTTP上 發送SOAP的語義會被映射到HTTP語義, 且不僅限于HTTP協議, SOAP也可以綁定至TCP/UDP協議上;

    通過HTTP發送 XML格式信息, 服務器端 轉換解析相應的 信息, 處理并響應.

    HTTP + XML = SOAP

    SOAP優點

  • 可擴展的。SOAP 無需中斷已有的應用程序, SOAP 客戶端、 服務器和協議自身都能發展。而且SOAP 能極好地支持中間介質和層次化的體系結構。
  • 簡單的。客戶端發送一個請求,調用相應的對象, 然后服務器返回結果。這些消息是XML 格式的,并且封裝成符合HTTP 協議的消息。因此,它符合任何路由器、 防火墻或代理服務器的要求。
  • 完全和廠商無關。SOAP可以相對于平臺、 操作系統、 目標模型和編程語言獨立實現。另外,傳輸和語言綁定以及數據編碼的參數選擇都是由具體的實現決定的。
  • 與編程語言無關。SOAP 可以使用任何語言來完成,只要客戶端發送正確SOAP 請求( 也就是說, 傳遞一個合適的參數給一個實際的遠端服務器)。SOAP 沒有對象模型,應用程序可以捆綁在任何對象模型中。
  • 個人思考:

    如果想要深入了解 SOAP, 需要了解 相應的 XML封裝, 同時對 XML擴展文本標記語言有一定程度的了解. 粗淺的使用, 目前足以;

    在看完了XML 和 XML schema 之后, 再對文章進行了一些補充更新, 對SOAP WSDL也有了更清晰的認知. 各種官方的語言 被轉化為實際的 代碼之后, 理解起來總是更簡單的.

    1.2 WSDL概述

    WebService的另一大核心:

    WSDL(Web Services Description Language) 網絡服務描述語言

    如同字面意思所描述的那樣,WSDL 是這樣一個基于 XML 的語言,用于描述 Web Service 及其函數、參數和返回值。因為是基于 XML 的,所以 WSDL 既是機器可閱讀的,又是人可閱讀的.(XML的自描述性)

    以下是幾個元素定義,有助于更直觀的理解 WSDL:

    <portType> web service 執行的操作

    下面截取了 WeatherWS.xml的一部分, 以便于對 WSDL 有更直觀的理解

    <wsdl:portType name="WeatherWSSoap"><wsdl:operation name="getRegionDataset"><wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><br /><h3>獲得中國省份、直轄市、地區;國家名稱(國外)和與之對應的ID</h3><p>輸入參數:無,返回數據:DataSet。</p><br /></wsdl:documentation><wsdl:input message="tns:getRegionDatasetSoapIn"/><wsdl:output message="tns:getRegionDatasetSoapOut"/></wsdl:operation><wsdl:operation name="getRegionProvince"><wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><br /><h3>獲得中國省份、直轄市、地區和與之對應的ID</h3><p>輸入參數:無,返回數據:一維字符串數組。</p><br /></wsdl:documentation><wsdl:input message="tns:getRegionProvinceSoapIn"/><wsdl:output message="tns:getRegionProvinceSoapOut"/></wsdl:operation><wsdl:operation name="getRegionCountry"><wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><br /><h3>獲得國外國家名稱和與之對應的ID</h3><p>輸入參數:無,返回數據:一維字符串數組。</p><br /></wsdl:documentation><wsdl:input message="tns:getRegionCountrySoapIn"/><wsdl:output message="tns:getRegionCountrySoapOut"/></wsdl:operation><wsdl:operation name="getSupportCityDataset"><wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><br /><h3>獲得支持的城市/地區名稱和與之對應的ID</h3><p>輸入參數:theRegionCode = 省市、國家ID或名稱,返回數據:DataSet。</p><br /></wsdl:documentation><wsdl:input message="tns:getSupportCityDatasetSoapIn"/><wsdl:output message="tns:getSupportCityDatasetSoapOut"/></wsdl:operation><wsdl:operation name="getSupportCityString"><wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><br /><h3>獲得支持的城市/地區名稱和與之對應的ID</h3><p>輸入參數:theRegionCode = 省市、國家ID或名稱,返回數據:一維字符串數組。</p><br /></wsdl:documentation><wsdl:input message="tns:getSupportCityStringSoapIn"/><wsdl:output message="tns:getSupportCityStringSoapOut"/></wsdl:operation><wsdl:operation name="getWeather"><wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><br /><h3>獲得天氣預報數據</h3><p>輸入參數:城市/地區ID或名稱,返回數據:一維字符串數組。</p><br /></wsdl:documentation><wsdl:input message="tns:getWeatherSoapIn"/><wsdl:output message="tns:getWeatherSoapOut"/></wsdl:operation> </wsdl:portType>

    它可描述一個 web service、可被執行的操作,以及相關的消息。

    <message> web service 使用的消息

    <types> web service 使用的數據類型

    <binding> web service 使用的通信協議

    需要了解更多的話, 官方文檔更為詳細: WSDL 文檔

    1.3 UDDI概述

    UDDI(Universal Description Discovery and Integration), UDDI 是一種目錄服務,企業可以使用它對 Web services 進行注冊和搜索。

    UDDI 指的是通用描述、發現與集成服務

    UDDI 是一種用于存儲有關 web services 的信息的目錄。

    UDDI 是一種由 WSDL 描述的 web services 界面的目錄。

    UDDI 經由 SOAP 進行通信

    UDDI 被構建入了微軟的 .NET 平臺

    總結來說:

    SOAP定義協議層交互, 映射, WSDL用來描述 WebService, UDDI 用來進行WebService 注冊 搜索.

    1.4 REST

    1.4.1 Rest基本含義


    在開始, 仍然是參考鏈接, 看過后,相信會對 Rest有一個比較全面的了解:

    REST簡介-Amber-Garden

    REST(Representational State Transfer) 表現層狀態轉移;

    REST通常基于使用HTTP,URI,和XML 以及HTML(標準通用標記語言下的一個應用)這些現有的廣泛流行的協議和標準。

    在閱讀上述博文前,可以先了解這樣幾個概念, 同時也是對Rest的一種描述:

    參考:REST無狀態的理解

  • 首先必須清楚的是 Rest是一種軟件架構風格而并非是標準;

  • Rest中并非是向以往的java項目設計那樣, 以業務邏輯/功能為考慮出發點, 而是以 資源 為出發點考慮的, 因此很重要的一個特性為 面向資源的接口設計。

  • 資源: 操作實體都作為資源來看待, 如在一個商城項目中, 商品類別, 具體的商品, 物流, 用戶資料 等都會被看做資源,你可以用一個URI(統一資源定位符)指向它,每種資源對應一個特定的URI。要獲取這個資源,訪問它的URI就可以,因此URI就成了每一個資源的地址或獨一無二的識別符。 而 Client端的操作都是對資源本身的操作。

  • 表現層: 指的是資源的表現層,它的具體表現形式,應該在HTTP請求的頭信息中用Accept和Content-Type字段指定,這兩個字段才是對"表現層"的描述。

  • 狀態: 應用狀態(Application State)和資源狀態(Resource State):
    • 應用狀態:指的是與某一特定請求相關的狀態信息
    • 資源狀態:則反映了某一存儲在服務器端資源在某一時刻的特定狀態,該狀態不會因為用戶請求而改變,任何用戶在同一時刻對該資源的請求都會獲得這一狀態的表現(Representation)。

    當用戶登錄后, 一般需要保存對應的 用戶信息, 用戶信息本身就是一種資源, 特定的用戶 對應著用戶資源的一種狀態, 而在服務器端取出存儲在Session中的用戶資源時, 實際上也就意味著 服務器保存著用戶資源的 狀態信息, 但在 Rest架構設計中, 實際上是期望請求方提供的,所以傳遞Session ID被認為是unRESTful的做法。

  • 深感自己水平有限, 知識儲備不足, 因此僅僅是將REST簡介-Amber-Garden博文的要點提出來:

    除了上述關于資源狀態的概念理解之外,還有以下信息:

  • Rest架構設計有以下幾條約束:

  • 使用客戶/服務器模型。客戶和服務器之間通過一個統一的接口來互相通訊。

  • 層次化的系統。在一個REST系統中,客戶端并不會固定地與一個服務器打交道。

  • 無狀態。在一個REST系統中,服務端并不會保存有關客戶的任何狀態。也就是說,客戶端自身負責用戶狀態的維持,并在每次發送請求時都需要提供足夠的信息。

  • 可緩存。REST系統需要能夠恰當地緩存請求,以盡量減少服務端和客戶端之間的信息傳輸,以提高性能。

  • 統一的接口。一個REST系統需要使用一個統一的接口來完成子系統之間以及服務與用戶之間的交互。這使得REST系統中的各個子系統可以獨自完成演化。

    其中無狀態 和 統一接口 又是 較為特別的約束條件:

  • 無狀態: 理解了狀態, 也就明白了什么叫無狀態, 在我的理解中, 通俗的來講就是, 對于一個請求, 請求中已經包含了足夠的信息, 并不需要服務器端自身保存任何資源, 用以進行對請求的處理, 資源的返回等。

  • 統一接口:

  • 每個資源都擁有一個資源標識。每個資源的資源標識可以用來唯一地標明該資源。

  • 消息的自描述性。在REST系統中所傳遞的消息需要能夠提供自身如何被處理的足夠信息。例如該消息所使用的MIME類型,是否可以被緩存等。

  • 資源的自描述性。一個REST系統所返回的資源需要能夠描述自身,并提供足夠的用于操作該資源的信息,如如何對資源進行添加,刪除以及修改等操作。也就是說,一個典型的REST服務不需要額外的文檔對如何操作資源進行說明。

  • HATEOAS。即客戶只可以通過服務端所返回各結果中所包含的信息來得到下一步操作所需要的信息,如到底是向哪個URL發送請求等。也就是說,一個典型的REST服務不需要額外的文檔標示通過哪些URL訪問特定類型的資源,而是通過服務端返回的響應來標示到底能在該資源上執行什么樣的操作。一個REST服務的客戶端也不需要知道任何有關哪里有什么樣的資源這種信息。

  • 除了資源的狀態, 定位以外, 則是對資源的操作: 基于HTTP, 則有:

  • GET 讀取某個資源。

  • DELETE 刪除某個資源

  • POST POST動詞會在目標URI之下創建一個新的子資源。

  • PUT則是根據請求創建或修改特定位置的資源。此時向服務端發送的請求的目標URI需要包含所處理資源的ID.(對于put請求仍然不是很理解)

  • Rest優點:

  • 優點是基于特性而來的, 最大的特性便是 無狀態。因為無狀態原則的特性,讓RESTful在分布式系統中得到了廣泛的應用,它改善了分布式系統的可見性、可靠性以及可伸縮性,同時有效的降低了Client與Server之間的交互延遲。

  • 其次,無狀態請求有較強的容錯性和可伸縮性。如果一臺服務器宕機,無狀態請求可以透明地交由另一臺可用Server來處理,而有狀態的請求則會因為存儲請求狀態信息的Server宕機而承擔狀態丟失的風險。

  • 至于 Rest架構設計等其他, 在博文中有說明, 且對WebService 影響不大, 在此就不再說明。

    2. WebService 與 Java

    在對WebService 及 SOAP 和 Rest有了基本的了解后, 接下來就是 WebService在Java中的簡單實現.

    2.1 SOAP方式

    2.1.1 使用 JDK 方式開發

    參考鏈接: https://www.cnblogs.com/xdp-gacl/p/4259481.html;

    重點在這樣幾個地方:

  • 在 接口類和實現類 均需要 @WebService注解, 同時在接口類的方法上, 采用@WebMethod接口

  • 在 main方法中, 用 EndPoint.publish(address, 實現類); 發布即可

  • 訪問的時候通過 address.wsdl 即可訪問發布的 WebService;

  • 打開命令行窗口,切換到src目錄,執行"wsimport -keep address?wsdl生成客戶端代碼.

  • 使用生成的java類創建實現類,調用對應的方法 接口.

  • 注解有以下幾種:
  • 類級別:

    • @javax.jws.WebService(targetNamespace = "", name = "",serviceName = "")

    • targetNamespace :生成的 WSDL 中使用的名稱空間.

    • name:Web Service 的名稱,映射到 WSDL 文件中的 元素

    • serviceName: Web Service 的服務名,映射到 WSDL 文件 元素。

    • @javax.jws.soap.SOAPBinding(parameterStyle = javax.jws.soap.SOAPBinding.ParameterStyle.BARE)

    • parameterStyle :確定方法參數是否表示整個消息正文,或者參數是否是包裝在以操作命名的頂層元素中的元素。默認值:javax.jws.soap.SOAPBinding.ParameterStyle.WRAPPED
  • 方法級別

    • @javax.jws.WebResult(name = "", targetNamespace = "", partName = "")

      name:指定生成的 WSDL 中的操作結果的名稱, 默認名稱“return”。

    • @javax.jws.WebMethod(operationName="")

      operationName: 指定方法公開的公共操作名,映射到 WSDL 文件中的 元素。沒有這個屬性的話,操作的公共名稱將與方法名相同。

    • @javax.jws.WebParam(name="",targetNamespace="")

      name: 指定輸入參數名,而不是該參數的Java;

  • 代碼如下:

    @WebService public interface IHelloWorld {@WebMethodString hello(); }@WebService public class HelloWorldImpl implements IHelloWorld {@overridepublic String hello() {return "helloWorld";} }public class Publish {public static void main(String[] args) {String address = "http://localhost:80/Server/Test";Endpoint.publish(address, new HelloWorldImpl());System.out.println("發布成功");} } //訪問地址為: //http://localhost:80/Server/Test?wsdl//在命令行中,切換到 Src文件夾下 , wsimport -keep http://localhost:80/Server/Test?wsdl 即可.public class WebServiceDemo {public static void main(String[] args) {//創建一個用于產生WebServiceImpl實例的工廠,WebServiceImplService類是wsimport工具生成的HelloWorldImplService factory = new HelloWorldImplService();//通過工廠生成一個WebServiceImpl實例,WebServiceImpl是wsimport工具生成的HelloWorldImpl wsImpl = factory.getHelloWorldImplPort();//調用WebService的sayHello方法String resResult = wsImpl.hello();} }

    通過以上代碼, 便實現了一個 WebService的發布, 而后訪問對應的網址, 生成對應的Java, 調用并使用相應的方法及接口.

    在天氣, 電話號碼,等等的已經開放的WebService服務在:

    http://www.webxml.com.cn/zh_cn/index.aspx

    如: 訪問2400多個城市天氣預報Web服務 即可使用:

    http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl 通過 wsimport -keep url 即可;

    當然在執行的時候可能會報錯:


    無法將名稱 's:schema' 解析為 'element declaration' 組件。

    這個時候需要在瀏覽器中 打開相應的 鏈接, 右鍵另存到本地,將文件中所有出現

    <s:element ref="s:schema"/><s:any/>

    的地方全部使用?

    <!--這句代碼的意思, 是 定義 任意 子元素出現的總次數--><s:any minOccurs="0" maxOccurs="unbounded"/>

    替換掉。

    而后使用 wsimport -keep 文件路徑即可.

    2.1.2 使用 cxf搭建WebService項目

    在這之前首先要提到 Java 開發WebService的幾種框架:

    參考鏈接: JAVA開發Web Service幾種框架介紹

    Axis,axis2,Xfire,CXF以及JWS, 其中 JWS 為 JavaWebService, 上面所說的 使用 JDK開發 WebService即為 JWS方式, 在 Java 1.6以后支持.

    如果你需要把你的實現側重JAVA并希望和Spring集成,CXF就是更好的選擇,特別是把你的Web Service嵌入其他的程序中。

    下面開始談談 cxf 開發WebService, 個人也是才開始了解 WebService 因此僅僅做出入門級的 使用開發案例.

    官方 jar 包下載:
    http://cxf.apache.org/download.html

    簡單流程如下:

  • 創建 JavaWeb項目

  • 在創建 接口和實現類的過程 與JWS并沒有區別, 不過不需要創建對應的 main方法, 畢竟是與 Spring相結合, 需要在 Web.xml 和 applicationContext.xml中配置即可.

  • 下面是對應的代碼:

    @WebService public interface WebServiceDemo {//如果沒有 WebMethod注解, 且配置屬性, 則方法名為 print;void print(); }@WebService public class WebServiceDemoImpl implements WebServiceDemo {@Overridepublic void print() {// TODO Auto-generated method stubSystem.out.println("print");}}//applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd"><jaxws:endpoint id="webServiceDemo" implementor="zyx.webservice.demo.WebServiceDemoImpl" address="/webServiceDemo"/> </beans>//web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>WebServiceDemo</display-name> <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet><servlet-name>CXFService</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>CXFService</servlet-name><url-pattern>/webservice/*</url-pattern> </servlet-mapping> </web-app>

    項目啟動后訪問路徑為:

    http://localhost/WebServiceDemo/webservice/webServiceDemo?wsdl

    至此:使用 SOAP方式, 發布一個 WebService項目已經介紹完了.

    2.2 Rest方式

    至于Rest的優點, 我就不再贅述, 在 1.4 節的介紹已經足夠進行簡單的開發了.

    Java中 Restful 框架實在不少, 在這里我使用的是: Jersey

    已經講到這里了, 就將 Rest相關注解也講一下, 有個大概的了解認識:

    參考鏈接: REST 在 Java 中的使用

  • 資源定位:正如之前提到的, 在統一接口 約束中的 子約束的第一條就是: 每個資源都要有 唯一標識 即 URI.

    @ApplicationPath 標識應用路徑,用于由@Path提供的所有資源uri的基本uri。當發布在一個servlet容器中,它的值可以使用web.xml中的servlet-mapping進行重寫。

    @path 標識要請求的資源類或類方法的uri路徑。

    @PathParam 將uri中指定的路徑參數綁定到資源方法參數

    @QueryParam 將http請求的Query參數綁定到資源方法參數,資源類的字段,或資源類的bean屬性。

    @FormParam 與上述用法類似,不過是將http請求的Form表單中的參數綁定到資源方法參數

    @CookieParam 同上

    @HeaderParam 指的是 http header的值

    @MatrixParam(不太了解)將uri矩陣參數的值綁定到資源方法參數,資源類的字段

    @DefaultValue 配置以上參數的默認值

    //UserResource下的根路徑@Path("/user")public class UserResource {@GET//傳遞參數 /user/user/zyx 則參數為 zyx;@Path("/user/{userName}")//訪問方法的路徑@Produces(MediaType.APPLICATION_JSON)///user/user/zyx?password=123 則password參數為123public User getUser(@DefaultValue("zyx") @PathParam("userName") String userName, @QueryParam("password") String password) {...}}

    @BeanParam 將請求中的bean綁定到資源方法參數,資源類的字段,或資源類的bean屬性

    //bean的配置@javax.xml.bind.annotation.XmlRootElementpublic class UserBean{@FormParam("userName")private String userName;@FormParam("age")private int age;...}//資源方法配置@Path("/user")public class UserRecource {@javax.ws.rs.POST@Path("/insertUserBean")@Consumes(MediaType.APPLICATION_FORM_URLENCODED)public String insertUserBean(@BeanParam UserBean userBean){...}}

    數據格式:

    @Consumes 定義一個資源類的方法或MessageBodyReader能夠接受的媒體類型。方法級別的@Consumes會覆蓋類級別的@Consumes。(指定接受的 Client端媒體類型)

    @Produces 方法級別的@Produces會覆蓋類級別的@Produces(用于定義方法的響應實體的數據類型)

    @Produces("application/json");

    指定多個MIME類型 @Produces({"application/json","application/xml"});

    也可以用常量值得方式指定:

    @Produces(value = {MediaType.APPLICATION_JSON})

    媒體類型的常量值在javax.ws.rs.core.MediaType中

    同時可以為每種類型定義質量因素: 質量因素是取值范圍從0到1的小數值。如果不定義質量因素,那么該類型的質量因素默認為1, 如果同一請求路徑對應不同的 處理 方法, 則根據 質量因素優先選取

    參考鏈接: ttp://book.51cto.com/art/201701/529132.htm

    @Encoded 不需要自動解碼,直接使用編碼后的請求值

  • 代碼如下:

    在這里我使用的是 maven: pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.com</groupId> <artifactId>demo02</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>demo02 Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.3.8.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-orm --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>4.3.8.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/javax.ws.rs/jsr311-api --><!-- 加了會報錯 --><!-- <dependency><groupId>javax.ws.rs</groupId><artifactId>jsr311-api</artifactId><version>1.1.1</version></dependency> --><!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.3.8.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.3.8.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.8.RELEASE</version></dependency><!--jersey --><dependency><groupId>org.glassfish.jersey.containers</groupId><artifactId>jersey-container-servlet-core</artifactId><version>2.13</version></dependency><!--JAXB API --><dependency><groupId>javax.xml.ws</groupId><artifactId>jaxws-api</artifactId><version>2.1</version></dependency><!-- Json支持 --><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-core-asl</artifactId><version>1.9.12</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.12</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-jaxrs</artifactId><version>1.9.12</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat8-maven-plugin --><!-- <dependency><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat8-maven-plugin</artifactId><version>3.0-r1756463</version></dependency> --></dependencies>

    web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>demo02</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><filter><filter-name>characterEncoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncoding</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>JerseyServlet</servlet-name><servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class><!-- 配置自己的資源加載類去加載資源 --><init-param><param-name>javax.ws.rs.Application</param-name><param-value>cn.com.easy.resource.ApplicationAPI</param-value></init-param><!-- 配置默認的資源包路徑,使用默認的配置類去加載資源 --><!-- <init-param> --><!-- <param-name>jersey.config.server.provider.packages</param-name> --><!-- <param-value>com.cisdi.jersey.api</param-value> --><!-- </init-param> --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>JerseyServlet</servlet-name><url-pattern>/restful/*</url-pattern></servlet-mapping> </web-app>

    定義自己的資源加載器

    /*** 這個類就是將各種資源加載進來,暴露給client, 可以自由選擇需要加載的資源, 日志等;* @author Administrator**/public class ApplicationAPI extends ResourceConfig {{System.out.println("啟動資源加載器");}public ApplicationAPI() {register(Demo.class);// 注冊數據轉換器register(JacksonJsonProvider.class);// 注冊日志register(LoggingFilter.class);}}

    定義對應的java類, 也即接口的訪問程序

    @Path("/demo")public class Demo {@GET@Path("/demo01/{username }")@Produces(value = {MediaType.APPLICATION_JSON})public String demo01(@PathParam("username") String username) {return username;}}

    再者就是 使用 Spring時的自定義配置, applicationContext.xml

    <!-- 自動注冊 --><context:annotation-config /><!-- 掃描對應的包 --><context:component-scan base-package="cn.com.easy.restful" />

    以上就是整個項目的搭建.

    我覺得項目的創建并不難, 也并不是在以后應該關注的店, 而在開發中更應該注意的是, Restful的設計風格, 很容易一不小心就走偏了. 需要對 Restful 的 資源, 狀態, 等概念理解到位, 這也是我最大的收獲.

    后感:
    個人感覺, SpringMvc 的項目搭建方式與 Restful 方式挺相近, 不過關注點不同, 在 SpringMvc 的核心點 是功能與業務邏輯, 而在Rest中, 更重要的是 資源本身, 甚至于 Get Post 等方式的選取也更重要, 以便于理清楚Rest的 資源邏輯 問題.

    轉載于:https://www.cnblogs.com/zyzdisciple/p/7868831.html

    總結

    以上是生活随笔為你收集整理的WebService初入的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。