RESTful Web服務可發現性,第4部分

這是有關使用Spring 3.1和Spring Security 3.1和基于Java的配置來建立安全的RESTful Web Service的系列文章的第四篇 。 本文將重點介紹REST API,HATEOAS的可發現性以及由測試驅動的實際方案。

引入REST可發現性

API的可發現性是一個值得引起足夠關注的主題,因此很少有API能夠正確地實現它。 如果做得正確,這也可以使API不僅具有RESTful和可用性,而且具有優雅的風格。

要了解可發現性 ,需要了解這種約束,即“超媒體作為應用程序狀態引擎(HATEOAS)”; RESTful API的這種約束是關于作為應用程序狀態唯一驅動程序的超媒體(實際上是超文本)對資源上的動作/轉換的完全可發現性。 如果交互作用是由API通過對話本身(特別是通過超文本)來驅動的,那么就沒有文檔 ,因為這會迫使客戶端做出實際上不在API上下文之外的假設。

此外,繼續這種邏輯思路,確實可以認為RESTful API的唯一方法是,如果它可以從根完全發現并且沒有先驗知識 ,這意味著客戶端應該能夠通過在GET上進行GET來導航API。根。 展望未來,所有狀態更改均由客戶端使用REST API在表示形式中提供的可用且可發現的轉換來驅動(因此稱為Representational State Transfer )。

總之,服務器應具有足夠的描述性,以指示客戶端如何僅通過超文本來使用API??,在HTTP對話的情況下,該超文本可能是Link標頭。

具體的可發現性場景(由測試驅動)


那么,REST服務可被發現意味著什么? 在本節中,我們將使用Junit, rest-assured和Hamcrest來測試可發現性的各個特征。 由于REST Service已在該系列的第3部分中得到保護,因此在使用API??之前,每個測試都需要首先進行身份驗證 。 還需要一些實用程序來解析響應的Link標頭。

發現有效的HTTP方法
當使用無效的HTTP方法使用RESTful Web服務時,響應應為405 METHOD NOT ALLOWED ; 此外,它還應該使用響應中的“ 允許 HTTP標頭”來幫助客戶端發現該特定資源所允許的有效HTTP方法:

@Test
public void whenInvalidPOSTIsSentToValidURIOfResource_thenAllowHeaderListsTheAllowedActions(){// Givenfinal String uriOfExistingResource = this.restTemplate.createResource();// WhenResponse res = this.givenAuthenticated().post( uriOfExistingResource );// ThenString allowHeader = res.getHeader( HttpHeaders.ALLOW );assertThat( allowHeader, AnyOf.<String> anyOf( containsString("GET"), containsString("PUT"), containsString("DELETE") ) );
}

發現新創建的資源的URI
使用位置 HTTP標頭,創建新資源的操作應始終在響應中包括新創建資源的URI。 如果客戶端在該URI上執行GET,則該資源應可用:

@Test
public void whenResourceIsCreated_thenURIOfTheNewlyCreatedResourceIsDiscoverable(){// WhenFoo unpersistedResource = new Foo( randomAlphabetic( 6 ) );Response createResponse = this.givenAuthenticated().contentType( MIME_JSON ).body( unpersistedResource ).post( this.paths.getFooURL() );final String uriOfNewlyCreatedResource = createResp.getHeader( HttpHeaders.LOCATION );// ThenResponse response = this.givenAuthenticated().header( HttpHeaders.ACCEPT, MIME_JSON ).get( uriOfNewlyCreatedResource );Foo resourceFromServer = response.body().as( Foo.class );assertThat( unpersistedResource, equalTo( resourceFromServer ) );
}

該測試遵循一個簡單的場景:創建一個新的Foo資源,并使用HTTP響應來發現該資源現在可訪問的URI 。 然后,測試會更進一步,并對該URI進行GET檢索以獲取資源并將其與原始資源進行比較,以確保資源已正確保留。

發現URI以獲取該類型的所有資源
當我們獲取特定的Foo實例時,我們應該能夠發現下一步可以做什么:我們可以列出所有可用的Foo資源。 因此,獲取資源的操作應始終在其響應中包含URI,以在何處獲取該類型的所有資源,再次使用Link標頭:

@Test
public void whenResourceIsRetrieved_thenURIToGetAllResourcesIsDiscoverable(){// GivenString uriOfExistingResource = this.restTemplate.createResource();// WhenResponse getResponse = this.givenAuthenticated().get( uriOfExistingResource );// ThenString uriToAllResources = HTTPLinkHeaderUtils.extractURIByRel( getResponse.getHeader( "Link" ), "collection" );Response getAllResponse = this.givenAuthenticated().get( uriToAllResources );assertThat( getAllResponse.getStatusCode(), is( 200 ) );
}

該測試解決了REST中鏈接關系的一個棘手問題:要檢索所有資源的URI使用rel =“ collection”語義。 這種類型的鏈接關系尚未標準化,但已被多種微格式使用 ,并已提出標準化要求。 非標準鏈接關系的使用打開了有關RESTful Web服務中的微格式和更豐富語義的討論。

其他可能發現的URI和微格式

其他URI可能會通過Link標頭發現,但是在沒有轉移到更豐富的語義標記(例如定義 自定義鏈接關系 , Atom發布協議或微格式)的情況下 ,現有的鏈接關系類型只有這么多。另一篇文章。

例如,如果在特定資源上執行GET時客戶端可以發現URI來創建新資源,那將是一個很好的選擇。 不幸的是,與模型創建語義沒有鏈接關系。 幸運的是,標準做法是創建的URI與獲取該類型的所有資源的URI相同,唯一的區別是POST HTTP方法。

結論

本文介紹了RESTful Web服務上下文中可發現性的一些特征,討論了HTTP方法發現,創建和獲取之間的關系,發現URI以獲取所有資源的關系等。在接下來的文章中,我將重點介紹從root ,分頁,自定義鏈接關系,Atom發布協議以及Spring REST服務中的Discoverability的實際實現開始發現API。 同時,檢查github項目 。

參考: RESTful Web服務可發現性,我們的JCG合作伙伴 Eugen Paraschiv在baeldung博客上的第4部分 。

相關文章 :

  • 使用Spring 3.1和基于Java的配置引導Web應用程序,第1部分
  • 使用Spring 3.1和基于Java的配置構建RESTful Web服務,第2部分
  • 使用Spring Security 3.1保護RESTful Web服務,第3部分
  • Spring的REST服務發現性,第5部分
  • 使用Spring Security 3.1的RESTful服務進行基本身份驗證和摘要身份驗證,第6部分
  • Spring&Quartz集成自定義注釋
  • Spring MVC攔截器示例
  • 在運行時交換出Spring Bean配置

翻譯自: https://www.javacodegeeks.com/2011/12/restful-web-service-discoverability.html

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

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

相關文章

10位IT領袖給應屆畢業生的10條忠告

10位IT領袖給應屆畢業生的10條忠告&#xff0c;在走向獨立和自主的偉大征程中&#xff0c;吸取他們的經驗。 在畢業生們邁出象牙塔之時&#xff0c;他們應該聽從哪些人的建議&#xff1f;在走向獨立和自主的偉大征程中&#xff0c;他們該吸取哪些教訓&#xff1f;聽一聽各領域…

ubuntu安裝好后常用軟件安裝和配置

1、安裝vim sudo apt install vim 安裝好后進入路徑打開vimrc文件&#xff0c;這里需要注意一定要用sudo不然編輯后無法保存&#xff01; cd /etc/vim sudo vim vimrc 在最下面加入 set nu set ts4 set softtabstop4 set shiftwidth4 set expandtab set autoindent 依次是…

Objective-c 數據類型

這里列出Objective-c中獨有數據類型&#xff1a; 一、字符串 在Objective-c中&#xff0c;字符串常量是由和一對從引號括起的字符串序列。比如&#xff1a;"China"、"objective-c"等都是合法的字符串常量。 二、id類型 id類型是Objective-c中一個比較獨…

JBoss AS 7 EJB3池配置

現在&#xff0c;AS 7.0.1已經發布&#xff0c;讓我們看一下可用的EJB3新功能。 就像我在上一篇文章中提到的那樣 &#xff0c;AS 7.0.1現在允許您為無狀態會話bean和MDB配置池。 當前&#xff0c;我們允許在子系統級別配置池&#xff0c;這意味著該池將適用于服務器上部署的所…

iOS開發網絡篇—文件的上傳

說明&#xff1a;文件上傳使用的時POST請求&#xff0c;通常把要上傳的數據保存在請求體中。本文介紹如何不借助第三方框架實現iOS開發中得文件上傳。 由于過程較為復雜&#xff0c;因此本文只貼出部分關鍵代碼。 主控制器的關鍵代碼&#xff1a; YYViewController.m 1 #import…

var模型的matlab實現_Eviews中VAR模型的操作、脈沖響應分析和方差分解的實現

打開文件所在位置&#xff0c;獲取數據。選中變量右鍵open打開var操作EViews,在VAR對象的工具欄中選擇“View”|“Lag Structure”|“AR Roots Table/ AR Roots Graph”選項&#xff0c;得到AR根的表和圖。結果顯示&#xff1a;VAR模型所有根模的倒數都小于1&#xff0c;即都在…

一個程序員的愛情表白書

我能抽象出整個世界 但是我不能抽象出你 因為你在我心中是那么的具體 所以我的世界并不完整 我可以重載甚至覆蓋這個世界里的任何一種方法 但是我卻不能重載對你的思念 也許命中注定了 你在我的世界里永遠的烙上了靜態的屬性 而我不慎調用了愛你這個方法 當我義無返顧的…

結構體、枚舉類型

一、結構體 結構體&#xff1a;就是一個自定義的集合&#xff0c;里面可以放各種類型的元素&#xff0c;用法大體跟集合一樣。 1、定義的方法&#xff1a; struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; …

NXP KW38開發雜記(一)MCUXpress 運行進入NMI_Handler

這里是大佬的具體分析過程&#xff0c;感興趣可以看看 https://www.cnblogs.com/wenhao-Web/p/13618703.html 解決辦法&#xff1a; 在startup_mkw38a4.c文件里&#xff0c;定位到Flash_Config {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE}; 把最后一個參數0xFFFFFFFE改…

25個讓Java程序員更高效的Eclipse插件

Eclipse提供了一個可擴展插件的開發系統。這就使得Eclipse在運行系統之上可以實現各種功能。這些插件也不同于其他的應用&#xff08;插件的功能是最難用代碼實現的&#xff09;。擁有合適的Eclipse插件是非常重要的&#xff0c;因為它們能讓Java開發者們無縫的開發基于J2EE和服…

NXP KW38藍牙開發(一)入門第一課:官網藍牙廣播和連接例程,NMI禁止

首先要下載開發使用的IDE&#xff1a;MCUXpresso IDE 下載鏈接&#xff1a; 進入nxp的官網&#xff0c;搜索KW38 向下翻看&#xff0c;找到Xpresso&#xff0c;點擊進入 習慣使用IAR開發的同學也可以下IAR版本&#xff0c;這里以Xpresso為例 下載好后安裝&#xff0c;一路默…

rough and crude

rough:物理上的粗糙或者說不平&#xff0c;高爾夫球場的生草區 crude:原始、未經加工的那種粗&#xff0c;即沒有精加工轉載于:https://www.cnblogs.com/dgyw/p/5767078.html

views 多個文件夾 netcore_.NET Core中的使用Kestrel服務器理解及應用

Kestrel是一個基于libuv的跨平臺.NET Core web服務器&#xff0c;libuv是一個跨平臺的異步I/O庫。ASP.NET Core模板項目使用Kestrel作為默認的web服務器。Kestrel支持以下功能&#xff1a;HTTPS用于啟用不透明升級的WebSockets位于Nginx之后的高性能Unix socketsKestrel 被.NET…

使用PowerMock測試對象的內部狀態

大多數單元測試都集中于測試對象的行為以證明其有效。 這可以通過編寫一個JUnit測試來實現&#xff0c;該測試調用對象的公共方法&#xff0c;然后測試這些調用的返回值是否與先前定義的一組期望值匹配。 這是一種非常常見且成功的技術。 但是&#xff0c;不應忘記對象也顯示狀…

布局

1&#xff09;ul li 把ul寬度設置大一點&#xff0c;然后overflowhidden;&#xff08;最好不要嵌套使用&#xff0c;原因看清除浮動方法&#xff09;&#xff0c;然后外面必須有包裹的div殼&#xff0c;div殼的寬度就按設計稿來&#xff0c;這樣就避免了需要給最后一個li設置m…

10個職場故事,讓人不得不看

1、強盜師徒 有一次&#xff0c;一個老強盜帶著徒弟去搶劫銀行&#xff0c;被警方追捕。兩人狂逃&#xff0c;差點兒連褲子都跑掉了。好不容易甩掉了警察&#xff0c;兩人上氣不接下氣&#xff0c;癱倒在地上。 良久&#xff0c;驚魂稍定&#xff0c;徒弟說:“師父啊師父&#…

NXP UWB NCJ29D5開發(一)環境搭建

1、從NXP的共享賬號下載資料 共享賬號需要找對接的NXP人員拿到&#xff0c;他會把資料分享到這個賬號&#xff0c;在這個賬號里面可以下載 進入nxp官網&#xff0c;登錄后點擊my nxp&#xff0c;選擇Software Licensing and Support 進入后接著選擇View accounts 進入后選擇…

西瓜創客python編程進階收費_西瓜創客和編程貓有什么不同?哪個更值得報名?...

看情況來決定即可&#xff0c;在課程內容上其實出入我覺得不是很大&#xff0c;重點是教學服務、師資、授課模式等&#xff0c;單純我自己的角度來說&#xff0c;我個人偏向于西瓜創客多一點&#xff0c;他們家的課程更具有趣味性&#xff0c;游戲化教學&#xff0c;融入卡通人…

Stack的三種含義

作者&#xff1a;阮一峰 學習編程的時候&#xff0c;經常會看到stack這個詞&#xff0c;它的中文名字叫做”棧”。 理解這個概念&#xff0c;對于理解程序的運行至關重要。容易混淆的是&#xff0c;這個詞其實有三種含義&#xff0c;適用于不同的場合&#xff0c;必須加以區分。…

NXP UWB NCJ29D5開發(二)BlinkyLed例程

路徑為UWB\NCJ29D5\NCJ29D5_CAS_Examples_v1.4\onic\BlinkyLed\toolsupport\keil 例程怎么來的可以看看上一篇NXP UWB NCJ29D5開發&#xff08;一&#xff09;環境搭建 1、 //系統選擇外部晶振&#xff0c;時鐘頻率為55.2Mhz phscaAppHal_Init(PHSCA_APPHAL_XO_CLOCK_SOURCE_…