構建RESTful服務(使用Spring Data JPA)

一.Restful簡介
REST是一種Web軟件結構風格,而不是一種標準,匹配或兼容這種架構風格稱之爲REST服務,REST服務簡潔並且有層次,REST通常基於HTTP,URI和XML以及HTML這些現有的廣泛流行的協議和標準,在REST中,資源是由URI來指定的,對資源的增刪改查也是通過HTTP協議提供的POST,PUT,GET,DELETE等方法實現,使用REST可以更高效率的利用緩存來提高響應速度,同時REST中的通信會話狀態有客戶端來維護,這可以讓不同服務器來處理一系列請求中的不同請求,進而提高服務器的擴展性,在前後端分離項目中,一個好的項目必然遵循REST架構風格
在Spring Mvc框架中,開發者可以提供RestController註解開發一個RESTful服務,不過Spring Boot對此提供了自動化配置方案,開發者只需要添加相關依賴即可快速構建一個RESTful服務
二.JPA實現REST
在Spring Boot中使用Spring Data JPA和Spring Data Rest可以快速開發一個RESTful服務。
1.基本實現
(1)創建項目:創建Spring Boot項目,添加如下依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
         <!--lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency> 

(2)這裏的依賴除了添加了數據庫相關依賴外還有Spring Data Jpa以及Spring Data Rest的依賴,項目建成後,接下來在配置文件中進行配置,配置如下:

server.port=8088

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/spring_vue?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=********

spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.open-in-view=true
spring.jpa.properties.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

2.創建實體類

@Entity
@Data
@Table(name = "book")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "author")
    private String author;

    @Column(name = "price")
    private float price;

}

3.創建BookRepository

public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor{

}

(3)這裏繼承了JpaRepository,JpaSpecificationExecutor,在JpaRepository中包含了很多現成的增刪改查的方法
4.測試
經過上面的步驟,簡單的RESTful架構就已經完成了,接下來進行測試:
(1)添加測試,這裏我們使用的Postman,RESTful構建成功後,默認的請求路徑是實體類名小名加上s,向數據庫添加一條數據很容易,發起一個post請求,並寫入要添加的數據即可,這裏數據以JSON格式爲準,如下:

構建RESTful服務(使用Spring Data JPA)

總結:路徑:localhost:8088/books,格式:JSON,請求類型:post
(2)分頁查詢測試,查詢是Get請求,分頁查詢請求路徑實體類小寫加s,這裏爲/books,分頁查詢的每頁默認記錄數爲20條,頁數是0,測試如下:

構建RESTful服務(使用Spring Data JPA)

總結:請求類型GET,無參數,路徑:localhost:8088/books
(3)根據id查詢,若是根據id進行查詢,只需要路徑後邊綴id即可,路徑如下:

構建RESTful服務(使用Spring Data JPA)

總結:路徑:localhost:8088/books/4,類型:GET
(4)分頁查詢擴展,添加查詢頁數,條數,以及添加排序,也是只需要後綴參數即可
構建RESTful服務(使用Spring Data JPA)

總結:路徑:localhost:8088/books?page=1&size=3,請求類型:GET
除了分頁以外還可以添加排序,如下:

構建RESTful服務(使用Spring Data JPA)

總結:路徑:localhost:8088/books?page=1&size=3&sort=id,desc,類型:GET
(5)修改測試,修改需要發送PUT請求,因爲修改是根據id進行的,因此路徑中需加入id,然後傳入修改數據(JSON格式),如下:
構建RESTful服務(使用Spring Data JPA)

總結:路徑:localhost:8088/books/15,請求參數圖中所示,請求類型:PUT
(6)刪除測試,使用DELETE請求可以實現對數據的刪除操作,例如刪除id爲1的記錄,路由如下:localhost:8088/books/11
5.自定義請求路徑
默認情況下,請求路徑都是實體類名加s,如果開發者想對路徑進行重定義,通過@RepositoryResource註解可實現

@RepositoryRestResource(path="bs",collectionResourceRel="bs",itemResourceRel="bs")
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor{

}

代碼解釋:@RepositoryResource註解的path屬性表示將所有請求路徑中的books都修改爲bs(localhost:8088/bs),collectionResourceRel表示將返回的JSON集合中book集合的key修改爲bs,itemResourceRel表示將返回的JSON集合中單個book的key修改爲b

構建RESTful服務(使用Spring Data JPA)

6.自定義查詢方法
默認的查詢方法支持分頁查詢,排序查詢以及按照id查詢,如果開發者想要按照某個屬性查詢,只需要在BookRepository中定義相關方法並暴露出去即可,代碼如下:

@RepositoryRestResource(path = "bs")
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor {
    @RestResource(path = "author", rel = "author")
    public List<Book> findByAuthor(@Param("author") String author);
}

代碼解釋:
自定義查詢只需要在BookRepository中定義查詢方法即可,方法定義好之後可以不添加@RestResource註解,默認路徑就是方法名,以上述自定義方法爲例,若是不添加@RestResource註解,則默認該方法調用路徑爲:localhost:8088/bs/search/findByAuthor?author=金庸,如果添加註解,對方法查詢路徑自定義,其中path就是最新路徑,如上方法,他的訪問路徑爲:localhost:8088/bs/search//author?author=金庸 ,如下:

構建RESTful服務(使用Spring Data JPA)

注意:用戶可以通過訪問:localhost:8088/bs/search,查詢目前都暴露了哪些查詢方法

7.隱藏方法
(1)默認情況下,繼承了Repository接口或是其子類的類都會被暴露出來,即開發者可以執行基本的增刪改查方法,如果開發者不想暴露此接口類對對象的操作各種方法,那麼就可以作如下配置:

@RepositoryRestResource(exported=false)
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor {
}

這樣此接口裏邊的所有方法都會失效
(2)若是隻是不想暴露某一個方法,就可以在此方法上加註解@RestResource,在註解中設定exported=false,這樣這個方法就會失效,如下:

@Override
    @RestResource(exported=false)
    void deleteById(Integer id);

8.配置CORS(跨域支持)
所有方法支持跨域訪問,在接口上加@CrossOrigin註解如下:

@CrossOrigin
@RepositoryRestResource(path = "bs")
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor {
    @RestResource(path = "author", rel = "author")
    public List<Book> findByAuthor(@Param("author") String author);

}

(2)單某些方法支持跨域,在要支持的方法上加@CrossOrigin註解
9.其他配置
開發者可以爲了方便開發添加常用屬性,如下:

spring.data.rest.default-page-size=2
spring.data.rest.page-param-name=path
spring.data.rest.sort-param-name=sort
spring.data.rest.limit-param-name=size
spring.data.rest.base-path=/api
spring.data.rest.return-body-on-create=true
spring.data.rest.return-body-on-update=true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章