Java中的WADL:溫和的介紹

WADL( Web應用程序描述語言 )對REST而言,WSDL對SOAP而言。 這種語言的僅僅存在引起了很多爭議(請參閱: 我們需要WADL嗎? 或者 需要 WADL還是不需要WADL )。 我可以想到使用WADL的一些合法用例,但是如果您已經在這里,則可能不打算再進行討論。 因此,讓我們繼續前進到WADL本身。

原則上,WADL與WSDL類似,但是語言的結構有很大不同。 雖然WSDL定義了使用或產生其中一些消息和操作的平面列表,但WADL強調了RESTful Web服務的分層性質。 在REST中,主要工件是資源。 每個資源(名詞)都表示為URI。 每個資源都可以定義CRUD操作(動詞,作為HTTP方法實現)和嵌套資源。 嵌套資源與父資源有很強的關系,通常代表所有權。

一個簡單的示例是表示書籍列表的http://example.com/api/books資源。 您可以(HTTP)獲取此資源,這意味著檢索整個列表。 您還可以獲取http://example.com/api/books/7資源,以在books資源中獲取第7本書的詳細信息。 或者,您甚至可以使用相同的URI放置新版本或完全刪除資源。 您不僅僅局限于一個嵌套級別:獲取http://example.com/api/books/7/reviews?page=2&size=10將會檢索第二本書(最多10本書)的第二頁(最多10個條目)。 顯然,您也可以在書籍旁邊放置其他資源,例如http://example.com/api/readers

就像WSDL人員能夠做到的那樣,要求正式而精確地描述每個可用資源,方法,請求和響應。 WADL是描述“可用URI”的選項之一,盡管有些人認為編寫良好的REST服務應該是自描述性的(請參閱HATEOAS )。 但是,這是一個簡單的空WADL文檔:

<application xmlns="http://wadl.dev.java.net/2009/02"><resources base="http://example.com/api"/>
</application>

這里沒什么好看的。 請注意, <resources>標記定義了基本API地址。 我們將要添加的所有命名資源都相對于該地址。 您還可以定義幾個<resources>標記來描述多個API。 因此,讓我們添加一個簡單的資源:

<application xmlns="http://wadl.dev.java.net/2009/02"><resources base="http://example.com/api"><resource path="books"><method name="GET"/><method name="POST"/></resource></resources>
</application>

這使用兩種可能的方法在http://example.com/api/books下定義資源:GET用于檢索整個列表,而POST用于創建(添加)新項目。 根據您的要求,您可能還希望允許DELETE方法(刪除所有項目),并且WADL負責記錄允許的內容。

還記得我們開頭的示例: / books / 7嗎? 顯然7只是一個示例,我們不會在WADL中聲明所有可能的書ID。 而是有一個方便的占位符語法:

<application xmlns="http://wadl.dev.java.net/2009/02"><resources base="http://example.com/api"><resource path="books"><method name="GET"/><resource path="{bookId}"><param required="true" style="template" name="bookId"/><method name="GET"/></resource></resource></resources>
</application>

您應注意兩個重要方面:首先,使用{ bookId }占位符代替嵌套資源。 其次,為了清楚起見,我們正在使用< param />標記記錄此占位符。 我們很快將看到如何將其與方法結合使用。 為了確保您仍然與我在一起,上面的文檔介紹了GET / booksGET / books / some_id資源。

<application xmlns="http://wadl.dev.java.net/2009/02"><resources base="http://example.com/api"><resource path="books"><method name="GET"/><resource path="{bookId}"><param required="true" style="template" name="bookId"/><method name="GET"/><method name="DELETE"/><resource path="reviews"><method name="GET"><request><param name="page" required="false" default="1" style="query"/><param name="size" required="false" default="20" style="query"/></request></method></resource></resource></resource><resource path="readers"><method name="GET"/></resource></resources>
</application>

Web服務變得越來越復雜,但是它描述了很多操作。 首先, GET / books / 42 / reviews是有效的操作。 但是有趣的部分是嵌套的<request />標記。 如您所見,我們可以獨立描述每種方法的參數。 在我們的案例中,定義了可選的查詢參數(與之前用于URI占位符的模板參數相反)。 這為客戶端提供了有關可接受的頁面和大小查詢參數的其他知識。 這意味著/ books / 7 / reviews?page = 2&size = 10是有效的資源標識符。 我是否提到過每個資源,方法和參數都可以按照WADL規范附加文檔?

我們將在這里停止,僅提及WADL的其余部分。 首先,到目前為止,您可能已經猜到了,每個<method />都有一個<response />子標記。 請求和響應都可以定義請求或響應必須遵循的確切語法(例如,在XML Schema中)。 該響應還可以記錄可能的HTTP響應代碼。 但是,由于我們將使用到目前為止在代碼優先應用程序中獲得的知識,因此我特意留下了<grammars />定義。 WADL是敏捷的,它使您可以定義所需的盡可能少的信息。

因此,我們知道了WADL的基礎知識,現在我們想使用它,可以作為基于Java的應用程序的使用者或生產者。 幸運的是,該語言本身有一個wadl.xsd XML Schema描述,我們可以使用它來生成可使用JAXB注釋的POJO(使用JDK中的xjc工具):

$ wget http://www.w3.org/Submission/wadl/wadl.xsd
$ xjc wadl.xsd

在那里...掛了! 軟件開發人員的生活充滿挑戰和非凡的問題。 有時,這只是一個令人討厭的網絡過濾器,可疑數據包(連同您半個小時的生命)消失了。 一旦您回想起2008年左右寫的文章: W3C的DTD流量過大 ,就不難發現問題了:

<xs:import namespace="http://www.w3.org/XML/1998/namespace"schemaLocation="http://www.w3.org/2001/xml.xsd"/>

從瀏覽器訪問xml.xsd會立即返回HTML頁面,但是xjc工具將永遠等待。 在本地下載此文件并更正wadl.xsd中schemaLocation屬性有助于。 總是小事……

$ xjc wadl.xsd 
parsing a schema... 
compiling a schema... 
net/java/dev/wadl/_2009/_02/Application.java 
net/java/dev/wadl/_2009/_02/Doc.java 
net/java/dev/wadl/_2009/_02/Grammars.java 
net/java/dev/wadl/_2009/_02/HTTPMethods.java 
net/java/dev/wadl/_2009/_02/Include.java 
net/java/dev/wadl/_2009/_02/Link.java 
net/java/dev/wadl/_2009/_02/Method.java 
net/java/dev/wadl/_2009/_02/ObjectFactory.java 
net/java/dev/wadl/_2009/_02/Option.java 
net/java/dev/wadl/_2009/_02/Param.java 
net/java/dev/wadl/_2009/_02/ParamStyle.java 
net/java/dev/wadl/_2009/_02/Representation.java 
net/java/dev/wadl/_2009/_02/Request.java 
net/java/dev/wadl/_2009/_02/Resource.java 
net/java/dev/wadl/_2009/_02/ResourceType.java 
net/java/dev/wadl/_2009/_02/Resources.java 
net/java/dev/wadl/_2009/_02/Response.java 
net/java/dev/wadl/_2009/_02/package-info.java

由于我們將在基于Maven的項目中使用這些類(并且我討厭將生成的類提交到源存儲庫),因此讓我們將xjc執行移至maven生命周期:

<plugin><groupId>org.codehaus.mojo</groupId><artifactId>jaxb2-maven-plugin</artifactId><version>1.3</version><dependencies><dependency><groupId>net.java.dev.jaxb2-commons</groupId><artifactId>jaxb-fluent-api</artifactId><version>2.0.1</version><exclusions><exclusion><groupId>com.sun.xml</groupId><artifactId>jaxb-xjc</artifactId></exclusion></exclusions></dependency></dependencies><executions><execution><goals><goal>xjc</goal></goals></execution></executions><configuration><arguments>-Xfluent-api</arguments><bindingFiles>bindings.xjb</bindingFiles><packageName>net.java.dev.wadl</packageName></configuration>
</plugin>

嗯, pom.xml并不是有史以來最簡潔的格式……沒關系,在每次編譯之前,這都會在編譯源代碼之前生成WADL XML類。 我還喜歡通順-API插件, 與*()與普通制定者一起的方法增加了回允許鏈接。 很方便 最后,我們為生成的工件定義更合適的包名稱(如果您發現net.java.dev.wadl._2009._02足夠好的包名稱,則可以跳過此步驟),并將Wadl前綴添加到所有生成的類bindings.xjb文件中:

<jxb:bindings version="1.0"xmlns:jxb="http://java.sun.com/xml/ns/jaxb"xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"jxb:extensionBindingPrefixes="xjc"><jxb:bindings schemaLocation="../xsd/wadl.xsd" node="/xs:schema"><jxb:schemaBindings><jxb:nameXmlTransform><jxb:typeName prefix="Wadl"/><jxb:anonymousTypeName prefix="Wadl"/><jxb:elementName prefix="Wadl"/></jxb:nameXmlTransform></jxb:schemaBindings></jxb:bindings></jxb:bindings>

現在,我們準備使用JAXB和POJO類以XML格式生成和使用WADL。 有了這些知識和基礎,我們就可以開發一些有趣的庫了,這將是下一篇文章的主題。

參考: Java和社區博客上我們的JCG合作伙伴 Tomasz Nurkiewicz 對WADL(Java)的簡要介紹。


翻譯自: https://www.javacodegeeks.com/2012/01/wadl-in-java-gentle-introduction.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373357.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373357.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

類成員函數模板特化

//類成員函數模板特化 #include <stdio.h> class A{ public:template <class T>void Print(){printf("A template\n");} };template<> void A::Print<int>(){printf("int\n"); }int main(){A a;a.Print<double>();a.Print&l…

為云量身定制您的服務

相信大家都聽說過Amazon的AWS。作為業內最為成熟的云服務提供商&#xff0c;其運行規模&#xff0c;穩定性&#xff0c;安全性都已經經過了市場的考驗。時至今日&#xff0c;越來越多的應用被部署在了AWS之上。這其中不乏Zynga及Netflix這樣著名的服務。 然而這一切并沒有停滯不…

在Vaadin和JSF之間選擇

隨著最新版本的Primefaces 3.0的發布&#xff0c;JSF終于達到了前所未有的成熟度和實用性&#xff0c;使其與其他流行的Rich Internet Applications&#xff08;RIA&#xff09;選項如Google Web Toolkit&#xff08;GWT&#xff09;&#xff0c;ExtJS&#xff0c;Vaadin&#…

20145202馬超《信息安全系統設計基礎》實驗二總結

[實驗二]&#xff08;http://www.cnblogs.com/nizaikanwoma/p/6131778.html&#xff09; 轉載于:https://www.cnblogs.com/tuolemi/p/6131987.html

java 連接ldap_ldap java 連接demo

public class LDAPHelper {/*** LDAP可以理解為一個多級目錄&#xff0c;這里&#xff0c;表示要連接到那個具體的目錄*/private final String baseDn "ouPeople,dcchangyeyi,dccom";private LdapContext ctx null;private final Control[] connCtls null;private…

flask開發restful api系列(1)

在此之前&#xff0c;向大家說明的是&#xff0c;我們整個框架用的是flask sqlalchemy redis。如果沒有開發過web&#xff0c;還是先去學習一下&#xff0c;這邊只是介紹如果從開發web轉換到開發移動端。如果flask還不是很熟悉&#xff0c;我建議先到這個網站簡單學習一下&am…

Apache Commons Lang StringUtils

因此&#xff0c;認為最好談論我喜歡的另一個Java庫。 它已經存在了一段時間&#xff0c;也許不是最令人興奮的庫&#xff0c;但是它非常有用。 我可能每天都使用它。 org.apache.commons.lang.StringUtils StringUtils是Apache Commons Lang&#xff08; http://commons.apac…

JEE7:展望新時代

計劃于2012年下半年發布的Java EE 7預計的JSR都已啟動并正在運行。 Java EE 7發行版是日期驅動的&#xff0c;它將反映該行業遷移到云中時不斷變化的需求&#xff1a;任何未準備就緒的內容將推遲到Java EE 8中使用 。 這是Java EE 7平臺中不同規范的關鍵功能的更新和摘要。 1。…

Cocos2d-JS項目之UI界面的優化

測試環境&#xff1a; iphone4、iOS6.1.2、chrome 37.2062.60&#xff0c;Cocos2d-js 3.6 之前寫了不少&#xff0c;實際項目也按這個去優化了&#xff0c;也有效果&#xff0c;但到最后才發現&#xff0c;尼瑪&#xff0c;之前都搞錯了&#xff0c;之所以有效果是歪打正著。。…

java數_java大數

java大數還是很好用的&#xff01;基本加入&#xff1a;import java.math.BigInteger;import jave.math.BigDecimal;分別是大數和大浮點數。首先讀入可以用&#xff1a;Scanner input new Scanner(System.in);BigInteger a input.nextBigInteger();這樣讀還是很方便的當然還有…

【Qt之Quick模塊】6. QML語法詳解_2類型系統

描述 在QML文檔中對象層次結構的定義中可能使用的類型可以來自各種來源。它們可能是: 由QML語言原生提供通過QML模塊通過c注冊由QML模塊作為QML文檔提供 此外&#xff0c;應用程序開發人員可以通過直接注冊c類型&#xff0c;或者通過在QML文檔中定義可重用的組件(然后可以導…

JS顯示當前時間(包含農歷時間)

時間格式&#xff1a; JavaScript代碼&#xff1a; var sWeek new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");var dNow new Date();var CalendarData new Arra…

Maven原型創建技巧

我最近需要為姜黃SOA項目創建一些Maven原型。 對于不了解的人來說&#xff0c; Maven原型是一種基于一些預先罐裝的項目模板生成項目的方法。 對于當前的姜黃SOA原型&#xff0c;它將創建一個多模塊Maven項目&#xff0c;該項目包含Interface和Service項目以及基本的WSDL和適當…

MyBatis操作指南-與Spring集成(基于注解)

轉載于:https://www.cnblogs.com/weilu2/p/mybatis_spring_integration_basic_on_annotation.html

Windows mysql boost_Win7下Boost庫的安裝

Boost庫是C領域公認的經過千錘百煉的知名C類庫&#xff0c;涉及編程中的方方面面&#xff0c;簡單記錄一下使用時的安裝過程1.boost庫的下載boost庫官網主頁&#xff1a;www.boost.org2.安裝將下載的壓縮包解壓到指定的目錄3.建立編譯工具bjam.exe在源碼目錄下執行bootstrap.ba…

5.2與終端進行對話

Linux提供了一個特殊的設備 /dev/tty &#xff0c;該設備始終是指向當前終端或者當前的登錄會話。 FILE* output fopen("/dev/tty", "w"); //向終端寫入字符串 fprintf(output, "%s\n", "world"); FILE* input fopen("/dev/tty…

JVM:如何分析線程轉儲

本文將教您如何分析JVM線程轉儲&#xff0c;并查明問題的根本原因。 從我的角度來看&#xff0c;線程轉儲分析是掌握Java EE生產支持的任何個人最重要的技能。 您可以從線程轉儲快照中獲取的信息量通常遠遠超出您的想象。 我的目標是與您分享我在過去10年中積累的有關線程轉儲分…

極光推送JPush的快速集成

首先到極光推送的官網上創建一個應用&#xff0c;填寫對應的應用名和包名。 創建好之后下載Demo 提取Sdk里面的圖片和xml等資源文件放自己項目的相應位置&#xff0c;然后要注意的是.so文件的放置位置&#xff1a; 在main目錄下新建一個jniLibs文件夾&#xff0c;放在這個文件夾…

c遺傳算法的終止條件一般_Matlab2 :Matlab遺傳算法(GA)優4~-r-具箱是基于基本操作 聯合開發網 - pudn.com...

Matlab2所屬分類&#xff1a;matlab例程開發工具&#xff1a;PDF文件大小&#xff1a;115KB下載次數&#xff1a;76上傳日期&#xff1a;2007-09-07 20:04:29上 傳 者&#xff1a;錢廣說明&#xff1a; &#xff1a;Matlab遺傳算法(GA)優4~-r-具箱是基于基本操作及終止條件、二…

用程序輸出表格

做應用程序的時候經常需要輸出excel表格&#xff0c;除了不同語言接口完善程度不同的麻煩以及要添加各種外部引用的麻煩之外還要考慮應用環境不同的office版本的問題&#xff0c;實在麻煩 當只需要輸出數據&#xff0c;不管顏色什么的的話&#xff0c;有個避免上述麻煩的辦法就…