溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

構(gòu)建RESTful服務(wù)(使用Spring Data JPA)

發(fā)布時(shí)間:2020-08-01 00:24:06 來源:網(wǎng)絡(luò) 閱讀:3659 作者:墨營 欄目:軟件技術(shù)

一.Restful簡介
REST是一種Web軟件結(jié)構(gòu)風(fēng)格,而不是一種標(biāo)準(zhǔn),匹配或兼容這種架構(gòu)風(fēng)格稱之為REST服務(wù),REST服務(wù)簡潔并且有層次,REST通?;贖TTP,URI和XML以及HTML這些現(xiàn)有的廣泛流行的協(xié)議和標(biāo)準(zhǔn),在REST中,資源是由URI來指定的,對資源的增刪改查也是通過HTTP協(xié)議提供的POST,PUT,GET,DELETE等方法實(shí)現(xiàn),使用REST可以更高效率的利用緩存來提高響應(yīng)速度,同時(shí)REST中的通信會話狀態(tài)有客戶端來維護(hù),這可以讓不同服務(wù)器來處理一系列請求中的不同請求,進(jìn)而提高服務(wù)器的擴(kuò)展性,在前后端分離項(xiàng)目中,一個(gè)好的項(xiàng)目必然遵循REST架構(gòu)風(fēng)格
在Spring Mvc框架中,開發(fā)者可以提供RestController注解開發(fā)一個(gè)RESTful服務(wù),不過Spring Boot對此提供了自動化配置方案,開發(fā)者只需要添加相關(guān)依賴即可快速構(gòu)建一個(gè)RESTful服務(wù)
二.JPA實(shí)現(xiàn)REST
在Spring Boot中使用Spring Data JPA和Spring Data Rest可以快速開發(fā)一個(gè)RESTful服務(wù)。
1.基本實(shí)現(xiàn)
(1)創(chuàng)建項(xiàng)目:創(chuàng)建Spring Boot項(xiàng)目,添加如下依賴

<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)這里的依賴除了添加了數(shù)據(jù)庫相關(guān)依賴外還有Spring Data Jpa以及Spring Data Rest的依賴,項(xiàng)目建成后,接下來在配置文件中進(jìn)行配置,配置如下:

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.創(chuàng)建實(shí)體類

@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.創(chuàng)建BookRepository

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

}

(3)這里繼承了JpaRepository,JpaSpecificationExecutor,在JpaRepository中包含了很多現(xiàn)成的增刪改查的方法
4.測試
經(jīng)過上面的步驟,簡單的RESTful架構(gòu)就已經(jīng)完成了,接下來進(jìn)行測試:
(1)添加測試,這里我們使用的Postman,RESTful構(gòu)建成功后,默認(rèn)的請求路徑是實(shí)體類名小名加上s,向數(shù)據(jù)庫添加一條數(shù)據(jù)很容易,發(fā)起一個(gè)post請求,并寫入要添加的數(shù)據(jù)即可,這里數(shù)據(jù)以JSON格式為準(zhǔn),如下:

構(gòu)建RESTful服務(wù)(使用Spring Data JPA)

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

構(gòu)建RESTful服務(wù)(使用Spring Data JPA)

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

構(gòu)建RESTful服務(wù)(使用Spring Data JPA)

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

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

構(gòu)建RESTful服務(wù)(使用Spring Data JPA)

總結(jié):路徑:localhost:8088/books?page=1&size=3&sort=id,desc,類型:GET
(5)修改測試,修改需要發(fā)送PUT請求,因?yàn)樾薷氖歉鶕?jù)id進(jìn)行的,因此路徑中需加入id,然后傳入修改數(shù)據(jù)(JSON格式),如下:
構(gòu)建RESTful服務(wù)(使用Spring Data JPA)

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

@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集合中單個(gè)book的key修改為b

構(gòu)建RESTful服務(wù)(使用Spring Data JPA)

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

@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注解,默認(rèn)路徑就是方法名,以上述自定義方法為例,若是不添加@RestResource注解,則默認(rèn)該方法調(diào)用路徑為:localhost:8088/bs/search/findByAuthor?author=金庸,如果添加注解,對方法查詢路徑自定義,其中path就是最新路徑,如上方法,他的訪問路徑為:localhost:8088/bs/search//author?author=金庸 ,如下:

構(gòu)建RESTful服務(wù)(使用Spring Data JPA)

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

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

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

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

@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.其他配置
開發(fā)者可以為了方便開發(fā)添加常用屬性,如下:

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
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI