一.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來指定的,對(duì)資源的增刪改查也是通過HTTP協(xié)議提供的POST,PUT,GET,DELETE等方法實(shí)現(xiàn),使用REST可以更高效率的利用緩存來提高響應(yīng)速度,同時(shí)REST中的通信會(huì)話狀態(tài)有客戶端來維護(hù),這可以讓不同服務(wù)器來處理一系列請(qǐng)求中的不同請(qǐng)求,進(jìn)而提高服務(wù)器的擴(kuò)展性,在前后端分離項(xiàng)目中,一個(gè)好的項(xiàng)目必然遵循REST架構(gòu)風(fēng)格
在Spring Mvc框架中,開發(fā)者可以提供RestController注解開發(fā)一個(gè)RESTful服務(wù),不過Spring Boot對(duì)此提供了自動(dòng)化配置方案,開發(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)目,添加如下依賴
成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、肅州網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為肅州等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-data-rest
org.springframework.boot
spring-boot-starter-web
MySQL
mysql-connector-java
runtime
com.alibaba
druid
1.1.10
org.projectlombok
lombok
true
(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, JpaSpecificationExecutor{
}
(3)這里繼承了JpaRepository,JpaSpecificationExecutor,在JpaRepository中包含了很多現(xiàn)成的增刪改查的方法
4.測(cè)試
經(jīng)過上面的步驟,簡單的RESTful架構(gòu)就已經(jīng)完成了,接下來進(jìn)行測(cè)試:
(1)添加測(cè)試,這里我們使用的Postman,RESTful構(gòu)建成功后,默認(rèn)的請(qǐng)求路徑是實(shí)體類名小名加上s,向數(shù)據(jù)庫添加一條數(shù)據(jù)很容易,發(fā)起一個(gè)post請(qǐng)求,并寫入要添加的數(shù)據(jù)即可,這里數(shù)據(jù)以JSON格式為準(zhǔn),如下:
總結(jié):路徑:localhost:8088/books,格式:JSON,請(qǐng)求類型:post
(2)分頁查詢測(cè)試,查詢是Get請(qǐng)求,分頁查詢請(qǐng)求路徑實(shí)體類小寫加s,這里為/books,分頁查詢的每頁默認(rèn)記錄數(shù)為20條,頁數(shù)是0,測(cè)試如下:
總結(jié):請(qǐng)求類型GET,無參數(shù),路徑:localhost:8088/books
(3)根據(jù)id查詢,若是根據(jù)id進(jìn)行查詢,只需要路徑后邊綴id即可,路徑如下:
總結(jié):路徑:localhost:8088/books/4,類型:GET
(4)分頁查詢擴(kuò)展,添加查詢頁數(shù),條數(shù),以及添加排序,也是只需要后綴參數(shù)即可
總結(jié):路徑:localhost:8088/books?page=1&size=3,請(qǐng)求類型:GET
除了分頁以外還可以添加排序,如下:
總結(jié):路徑:localhost:8088/books?page=1&size=3&sort=id,desc,類型:GET
(5)修改測(cè)試,修改需要發(fā)送PUT請(qǐng)求,因?yàn)樾薷氖歉鶕?jù)id進(jìn)行的,因此路徑中需加入id,然后傳入修改數(shù)據(jù)(JSON格式),如下:
總結(jié):路徑:localhost:8088/books/15,請(qǐng)求參數(shù)圖中所示,請(qǐng)求類型:PUT
(6)刪除測(cè)試,使用DELETE請(qǐng)求可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的刪除操作,例如刪除id為1的記錄,路由如下:localhost:8088/books/11
5.自定義請(qǐng)求路徑
默認(rèn)情況下,請(qǐng)求路徑都是實(shí)體類名加s,如果開發(fā)者想對(duì)路徑進(jìn)行重定義,通過@RepositoryResource注解可實(shí)現(xiàn)
@RepositoryRestResource(path="bs",collectionResourceRel="bs",itemResourceRel="bs")
public interface BookRepository extends JpaRepository, JpaSpecificationExecutor{
}
代碼解釋:@RepositoryResource注解的path屬性表示將所有請(qǐng)求路徑中的books都修改為bs(localhost:8088/bs),collectionResourceRel表示將返回的JSON集合中book集合的key修改為bs,itemResourceRel表示將返回的JSON集合中單個(gè)book的key修改為b
6.自定義查詢方法
默認(rèn)的查詢方法支持分頁查詢,排序查詢以及按照id查詢,如果開發(fā)者想要按照某個(gè)屬性查詢,只需要在BookRepository中定義相關(guān)方法并暴露出去即可,代碼如下:
@RepositoryRestResource(path = "bs")
public interface BookRepository extends JpaRepository, JpaSpecificationExecutor {
@RestResource(path = "author", rel = "author")
public List findByAuthor(@Param("author") String author);
}
代碼解釋:
自定義查詢只需要在BookRepository中定義查詢方法即可,方法定義好之后可以不添加@RestResource注解,默認(rèn)路徑就是方法名,以上述自定義方法為例,若是不添加@RestResource注解,則默認(rèn)該方法調(diào)用路徑為:localhost:8088/bs/search/findByAuthor?author=金庸,如果添加注解,對(duì)方法查詢路徑自定義,其中path就是最新路徑,如上方法,他的訪問路徑為:localhost:8088/bs/search//author?author=金庸 ,如下:
注意:用戶可以通過訪問:localhost:8088/bs/search,查詢目前都暴露了哪些查詢方法
7.隱藏方法
(1)默認(rèn)情況下,繼承了Repository接口或是其子類的類都會(huì)被暴露出來,即開發(fā)者可以執(zhí)行基本的增刪改查方法,如果開發(fā)者不想暴露此接口類對(duì)對(duì)象的操作各種方法,那么就可以作如下配置:
@RepositoryRestResource(exported=false)
public interface BookRepository extends JpaRepository, JpaSpecificationExecutor {
}
這樣此接口里邊的所有方法都會(huì)失效
(2)若是只是不想暴露某一個(gè)方法,就可以在此方法上加注解@RestResource,在注解中設(shè)定exported=false,這樣這個(gè)方法就會(huì)失效,如下:
@Override
@RestResource(exported=false)
void deleteById(Integer id);
8.配置CORS(跨域支持)
所有方法支持跨域訪問,在接口上加@CrossOrigin注解如下:
@CrossOrigin
@RepositoryRestResource(path = "bs")
public interface BookRepository extends JpaRepository, JpaSpecificationExecutor {
@RestResource(path = "author", rel = "author")
public List 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