簡介
HATEOAS是實現REST規范的一種原則,通過遵循HATEOAS規范,可以解決我們實際代碼實現的各種個問題。作為java最流行的框架Spring
當然也會不缺席HATEOAS的集成。
本文將會通過一個具體的例子來講解如何在SpringBoot中使用HATEOAS。
文章目標
HATEOAS規則中,返回的數據會帶有鏈接。我們以熟悉的Book為例,來展示這次的HATEOAS,首先創建一個Book entity:
@Data
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
}
我們希望能夠通過下面的鏈接來獲取到Book的詳細數據:
GET /book/1
返回的數據如下:
{
"content": {
"id": 1,
"title": "The Hobbit"
},
"_links": {
"self": {
"href": "http://localhost:8080/book/1"
}
}
}
可以看到在返回的數據中除了content包含了book的信息之外,還有一個_links屬性,表示和該Book相關的資源鏈接。
構建Entity和Repository
在做任何數據之前,我們都需要構建相應的數據,也就是entity和對應的數據操作,為了簡便起見,我們使用H2的內存數據庫。
我們需要在application.properties中配置如下:
spring.jpa.hibernate.ddl-auto=validate
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
然后配置對應的repository :
public interface BookRepository extends CrudRepository<Book, Long> {
long deleteByTitle(String title);
@Modifying
@Query("delete from Book b where b.title=:title")
void deleteBooks(@Param("title") String title);
}
同時,需要在resources中放置創建table的schema.sql和插入數據的data.sql。這樣在程序啟動的時候就可以自動創建相應的數據。
構建HATEOAS相關的RepresentationModel
如果要讓自己來實現,也可以實現添加鏈接的操作,但是這樣就太復雜了,還好我們有Spring。
要在Spring中使用HATEOAS,需要進行如下配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
如果我們想要對Book進行HATEOAS的構建,那么可以構建一個類,繼承RepresentationModel即可:
public class BookModel extends RepresentationModel<BookModel> {
private final Book content;
@JsonCreator
public BookModel(@JsonProperty("content") Book content) {
this.content = content;
}
public Book getContent() {
return content;
}
}
上面的例子中,我們用RepresentationModel
封裝了一個Book對象,并將其設置為json的content屬性。
構建Controller
有了RepresentationModel,我們就可以使用它來構建HATEOAS的響應了。
我們看下面的例子:
@RequestMapping("/book/{id}")
public HttpEntity<Book> getBook(@PathVariable("id") Long id) {
Book book= bookRepository.findById(id).get();
BookModel bookModel = new BookModel(book);
bookModel.add(linkTo(methodOn(BookController.class).getBook(id)).withSelfRel());
return new ResponseEntity(bookModel, HttpStatus.OK);
}
上面的例子中,我們使用@RequestMapping來構建了一個HTTP請求,通過傳入book的id來從數據庫中查找相應的Book數據。
然后將其傳入BookModel中,構建好RepresentationModel。這時候可以直接返回這個對象。但是我們還需要向其添加一些links。
我們使用bookModel.add來添加相應的link。并且使用linkTo方法來生成相應的link。最后將RepresentationModel返回。當我們請求/book/1的時候,就會得到最前面我們想要得到的json值。使用HATEOAS是不是很簡單?
HATEOAS的意義
HATEOAS帶有相應的資源鏈接,通過一個資源就可以得到從這個資源可以訪問的其他的資源,就像是一個訪問到一個頁面,可以再通過這個頁面去訪問其他的頁面一樣。所以HATEOAS的意義就在于我們只需要訪問一個資源就可以遍歷所有的資源。我們通過測試來體驗一下資源的訪問。
首先,我們直接訪問/book/1這個資源,來確認下得到的結果:
@Test
void envEndpointNotHidden() throws Exception {
mockMvc.perform(get("/book/1"))
.andExpect(jsonPath("$.content.title").value("The Hobbit"));
}
然后再通過Spring HATEOAS提供的Traverson類來進行鏈接的遍歷:
@Test
void envEndpointNotHidden() throws Exception {
Traverson traverson = new Traverson(new URI("http://localhost:" + this.port + "/book/1"), MediaTypes.HAL_JSON);
String bookTitle = traverson.follow("self").toObject("$.content.title");
assertThat(bookTitle).isEqualTo("The Hobbit");
}
到此這篇關于在SpringBoot中使用HATEOAS的方法的文章就介紹到這了,更多相關SpringBoot使用HATEOAS內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!