SpringBoot中的HATEOAS詳情
簡(jiǎn)介
SpringBoot提供了HATEOAS的便捷使用方式,本文詳細(xì)講解SpringBoot提供的這些基本方法。
鏈接Links
HATEOAS的一個(gè)非常重要的特征就是在resources資源中包含超媒體,而超媒體最簡(jiǎn)單的表示就是鏈接。
Spring HATEOAS為我們簡(jiǎn)化了封裝Links的功能。
我們看一個(gè)HTML中的link標(biāo)簽的例子:
<head> <link rel="stylesheet" type="text/css" href="theme.css" rel="external nofollow" /> </head>
可以看到一個(gè)link有兩個(gè)比較重要的屬性,一個(gè)是href代表link的鏈接,還有一個(gè)屬性是rel表示的當(dāng)前文檔與被鏈接文檔之間的關(guān)系。
我們看下Link中的關(guān)鍵方法:
public static Link of(String href) { return new Link(href); } public static Link of(String href, String relation) { return new Link(href, relation); } public static Link of(String href, LinkRelation relation) { return new Link(href, relation); }
可以傳入href和relation來構(gòu)建一個(gè)Link對(duì)象。
看下面的例子:
Link link = Link.of("/something"); link = Link.of("/something", "my-rel")
其中LinkRelation是關(guān)聯(lián)關(guān)系的一個(gè)封裝接口,注意,它是一個(gè)接口,我們可以使用IanaLinkRelations中的具體實(shí)現(xiàn)來對(duì)其賦值,如下所示:
LinkRelation REL_SELF = IanaLinkRelations.SELF; LinkRelation REL_FIRST = IanaLinkRelations.FIRST; LinkRelation REL_PREVIOUS = IanaLinkRelations.PREV; LinkRelation REL_NEXT = IanaLinkRelations.NEXT; LinkRelation REL_LAST = IanaLinkRelations.LAST;
URI templates
上面的例子中l(wèi)ink是指定好的,是靜態(tài)的。有時(shí)候我們希望link可以根據(jù)參數(shù)進(jìn)行變換,那么這樣的link就是動(dòng)態(tài)的link,我們可以通過定義URI模板來實(shí)現(xiàn)。
所以Link還可以通過UriTemplate來構(gòu)建:
public static Link of(UriTemplate template, String relation) { return new Link(template, relation); } public static Link of(UriTemplate template, LinkRelation relation) { return new Link(template, relation); }
UriTemplate是對(duì)URI模板的封裝,我們看一個(gè)使用的例子:
Link link = Link.of("/{segment}/something{?parameter}"); Map<String, Object> values = new HashMap<>(); values.put("segment", "path"); values.put("parameter", 42); assertThat(link.expand(values).getHref()) .isEqualTo("/path/something?parameter=42");
上面的例子中,通過string來構(gòu)建一個(gè)link,然后調(diào)用expand傳入?yún)?shù)對(duì)應(yīng)的map,來構(gòu)建真實(shí)的href值。
除了直接使用string之外,還可以傳入U(xiǎn)riTemplate:
UriTemplate template = UriTemplate.of("/{segment}/something") .with(new TemplateVariable("parameter", VariableType.REQUEST_PARAM); assertThat(template.toString()).isEqualTo("/{segment}/something{?parameter}");
Link relations
Link relations指的是link中的ref屬性。代表的是當(dāng)前文檔與被鏈接文檔之間的關(guān)系。Spring HATEOAS中有一個(gè)LinkRelation類來表示。
IANA(Internet Assigned Numbers Authority)預(yù)定義了一些relations,可以通過IanaLinkRelations這個(gè)類來獲取,如下所示:
Link link = Link.of("/some-resource"), IanaLinkRelations.NEXT); assertThat(link.getRel()).isEqualTo(LinkRelation.of("next")); assertThat(IanaLinkRelation.isIanaRel(link.getRel())).isTrue();
Representation models
我們需要訪問的是一個(gè)個(gè)的資源,然后需要在一個(gè)個(gè)的資源中加入link,Spring HATEOAS為我們提供了一個(gè)簡(jiǎn)單的類叫做RepresentationModel。它包含了Links和一些很方便的方法來幫助我們創(chuàng)建帶鏈接的資源。
最簡(jiǎn)單的使用方法就是創(chuàng)建一個(gè)RepresentationModel的子類:
public class BookModel extends RepresentationModel<BookModel> { private final Book content; }
我們通過add方法來對(duì)其添加link:
bookModel.add(linkTo(methodOn(BookController.class).getBook(id)).withSelfRel());
注意:在這種情況下,我們的Accept類型應(yīng)該是application/hal+json。
對(duì)于簡(jiǎn)單類型,我們可以直接使用EntityModel對(duì)其進(jìn)行封裝:
Person person = new Person("Dave", "Matthews"); EntityModel<Person> model = EntityModel.of(person);
對(duì)于集合,可以使用CollectionModel:
Collection<Person> people = Collections.singleton(new Person("Dave", "Matthews")); CollectionModel<Person> model = CollectionModel.of(people);
總結(jié)
上講解的Link,URI templates,Link relations和RepresentationModel就是Spring HATEOAS的基礎(chǔ),掌握了他們基本上就掌握了Spring HATEOAS。
到此這篇關(guān)于SpringBoot中的HATEOAS詳情的文章就介紹到這了,更多相關(guān)HATEOAS內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java對(duì)時(shí)間的簡(jiǎn)單操作實(shí)例
這篇文章主要介紹了Java對(duì)時(shí)間的簡(jiǎn)單操作,實(shí)例分析了針對(duì)java.util.Date的各類常見操作,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01Spring測(cè)試基本的控制器實(shí)戰(zhàn)示例
這篇文章主要為大家介紹了Spring測(cè)試基本的控制器實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10springboot配置開發(fā)和測(cè)試環(huán)境并添加啟動(dòng)路徑方式
這篇文章主要介紹了springboot配置開發(fā)和測(cè)試環(huán)境并添加啟動(dòng)路徑方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java 實(shí)現(xiàn)雙向鏈表實(shí)例詳解
這篇文章主要介紹了java 實(shí)現(xiàn)雙向鏈表實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀
這篇文章主要介紹了springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀,本篇是關(guān)于springboot的參數(shù)校驗(yàn)知識(shí),當(dāng)然也適用其它java應(yīng)用,讀完本篇將學(xué)會(huì)基本的參數(shù)校驗(yàn),自定義參數(shù)校驗(yàn)和分組參數(shù)校驗(yàn),需要的朋友可以參考下2023-10-10Spring Boot使用JSR-380進(jìn)行校驗(yàn)的示例
這篇文章主要介紹了Spring Boot使用JSR-380進(jìn)行校驗(yàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03java實(shí)現(xiàn)對(duì)excel文件的處理合并單元格的操作
這篇文章主要介紹了java實(shí)現(xiàn)對(duì)excel文件的處理合并單元格的操作,開頭給大家介紹了依賴引入代碼,表格操作的核心代碼,代碼超級(jí)簡(jiǎn)單,需要的朋友可以參考下2021-07-07SpringBoot創(chuàng)建JSP登錄頁(yè)面功能實(shí)例代碼
這篇文章主要介紹了SpringBoot創(chuàng)建JSP登錄頁(yè)面功能實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-04-04