SpringBoot教程(第4版)課件 第7章 REST風格接口開發(fā)_第1頁
SpringBoot教程(第4版)課件 第7章 REST風格接口開發(fā)_第2頁
SpringBoot教程(第4版)課件 第7章 REST風格接口開發(fā)_第3頁
SpringBoot教程(第4版)課件 第7章 REST風格接口開發(fā)_第4頁
SpringBoot教程(第4版)課件 第7章 REST風格接口開發(fā)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第7章REST風格接口開發(fā)——REST接口概述SpringBoot實用教程(第4版)目錄01REST簡介1.基本概念2.HTTP動作3.REST風格4.架構(gòu)原則REST簡介1.基本概念REST將資源的狀態(tài)以適合客戶端的形式從服務器發(fā)送到客戶端(或相反),通過URI進行資源定位,用HTTP動作描述操作,完成功能。(1)資源所謂“資源”也就是互聯(lián)網(wǎng)系統(tǒng)中一個具體存在的可供請求使用的對象,它可以是一般關系數(shù)據(jù)庫中的記錄,也可以是一些特殊媒體類型數(shù)據(jù)(如圖片、歌曲、視頻等),甚至還可以是系統(tǒng)權限用戶、角色和菜單等。在REST中,每一個資源都會對應有一個獨一無二的URI(UniformResourceIdentifier,統(tǒng)一資源標識符),要獲取這個資源,只須發(fā)起請求去訪問它的URI即可。在REST中,URI有時候也被稱為端點(EndPoint)。(2)表現(xiàn)層有了資源還需要確定如何表現(xiàn)這個資源。例如,一個用戶記錄可以以JSON、XML或其他的形式表示。在現(xiàn)今的互聯(lián)網(wǎng)開發(fā)中,JSON已經(jīng)是最通用的表現(xiàn)形式,所以通常網(wǎng)絡上的數(shù)據(jù)都會以JSON格式表示和傳輸。(3)狀態(tài)轉(zhuǎn)換實際應用中的資源并非一成不變,一個資源可以經(jīng)歷創(chuàng)建、訪問、修改和刪除的過程。由于HTTP是一個沒有狀態(tài)的協(xié)議,這也就意味著資源的狀態(tài)變化只能保存在服務器端,在HTTP中存在多種動作來對應這些變化。REST簡介2.HTTP動作對于一個資源而言,既然它存在創(chuàng)建、訪問、修改和刪除這樣的狀態(tài)轉(zhuǎn)換,也就對應于HTTP行為的多種不同動作,如下:(1)(2)(3)(4)(5)GET:訪問服務器資源(一個、多個或全部)。POST:向服務器提交資源信息,用來創(chuàng)建新的資源。PUT:修改服務器上已經(jīng)存在的資源。此動作會把資源的所有屬性一并提交。PATCH:修改服務器上已經(jīng)存在的資源。此動作只將資源的部分需要修改的屬性提交。DELETE:從服務器上刪除資源。REST簡介3.REST風格(1)核心理念REST風格的核心理念是:將資源的定位與操作分離開來,URI僅負責描述資源所在位置,而由HTTP動作來描述要對資源進行的具體操作?;诖朔N理念,REST風格的URI中是不應當包含動詞的,例如,前面章節(jié)實例要查詢數(shù)據(jù)庫中商品號為1的商品信息,訪問如下地址:http://localhost:8080/com/get?pid=1這顯然不符合REST規(guī)范,真正REST風格的地址應當設計成這樣:http://localhost:8080/coms/1然后向這個地址發(fā)起GET請求來獲取1號商品的記錄。如果現(xiàn)在的需求變?yōu)閯h除1號商品,則在REST風格下同樣也是訪問這個地址,只不過需要把請求的動作類型改為DELETE。REST簡介(2)參數(shù)傳遞方式REST將參數(shù)作為URI的組成部分,通過對URI本身的精心設計來獲取參數(shù),而不是像傳統(tǒng)請求那樣將參數(shù)拼接在地址后面逐一賦值攜帶。例如,添加商品記錄。傳統(tǒng)的訪問地址為:http://localhost:8080/com/add?參數(shù)1=值1&參數(shù)2=值2&...&參數(shù)n=值nREST風格的地址為:http://localhost:8080/coms/值1/值2/.../值n如果要傳遞的參數(shù)數(shù)目較多(多于5個),則通常采取傳遞一個JSON對象體的方式來傳遞參數(shù),訪問地址就簡化為:http://localhost:8080/coms然后將所有參數(shù)封裝于一個JSON對象:{"參數(shù)1":值1,"參數(shù)2":值2,...,"參數(shù)n":值n}REST簡介4.架構(gòu)原則除對URI設計風格的要求外,REST對互聯(lián)網(wǎng)軟件的架構(gòu)同樣也有一套特別的約束條件和原則,體現(xiàn)在如下幾點。(1)采用客戶/服務器模型REST系統(tǒng)必須基于客戶/服務器(C/S)方式工作,提供資源的服務器和使用資源的客戶端需要被隔離對待,兩者之間通過一個統(tǒng)一的接口來互相通信。(2)標準化通信在一個REST系統(tǒng)中,客戶端并不會固定地與同一個服務器打交道,故服務器和客戶端之間的通信必須被標準化。(3)無狀態(tài)REST系統(tǒng)都是基于HTTP協(xié)議的,而HTTP連接最顯著的特點是:客戶端發(fā)送的每次請求都需要服務器回送響應,在請求結(jié)束后主動釋放連接。從建立連接到關閉連接的過程稱為“一次請求”,前后的請求并沒有必然聯(lián)系,所以是無狀態(tài)的。服務端并不會保存有關客戶的任何狀態(tài),需要客戶端負責自身狀態(tài)的維持,并在每次發(fā)送請求時提供足夠的信息。REST簡介(4)可緩存REST系統(tǒng)需要恰當?shù)鼐彺嬲埱?,以盡量減少服務器和客戶端之間的信息傳輸量、提高性能,而且服務器必須讓客戶知道請求是否可以被緩存。(5)統(tǒng)一接口REST系統(tǒng)需要通過一個統(tǒng)一的接口來完成各子系統(tǒng)間以及服務器與客戶之間的交互,故客戶與服務器之間通信的方法必須統(tǒng)一。對于客戶端發(fā)起的請求操作,REST將對數(shù)據(jù)的元操作(增刪改查)分別對應到HTTP幾種基本的動作類型上,即用POST新建資源,用DELETE刪除資源,用PUT/PATCH更新資源,用GET來獲取資源,這樣就統(tǒng)一了數(shù)據(jù)操作的接口。對于返回客戶端的響應結(jié)果,REST全都用HTTP狀態(tài)碼表示,每一個狀態(tài)碼(如200、201、202、204、400、401、403、500等)在REST中都有特定的含義,比如,200表示操作成功;401表示用戶身份認證失??;403表示驗證身份通過了,但資源沒有操作權限。這樣又統(tǒng)一了返回消息的接口。目錄02Postman接口調(diào)試工具Postman接口調(diào)試工具已經(jīng)有很多種接口調(diào)試工具,目前用于REST接口調(diào)試最流行的工具當屬Postman,它能模擬各種動作類型的HTTP請求,且與瀏覽器相比,它能直接輸出JSON格式數(shù)據(jù),讓用戶直觀地看到接口返回的結(jié)果。本章開發(fā)的接口都使用Postman作調(diào)試工具,下面先來介紹Postman的安裝和使用。(1)獲取Postman從網(wǎng)絡各種渠道均可獲得Postman,一般以壓縮包的形式提供,筆者所使用的壓縮包文件名為Postman5.5.5.zip,對其解壓,存盤到某個路徑下待用。(2)安裝GoogleChrome瀏覽器通常Postman是作為GoogleChrome瀏覽器的一個插件運行的,所以安裝Postman首先要有GoogleChrome瀏覽器,這個瀏覽器是免費的,可以很容易下載到安裝可執(zhí)行程序來進行安裝,過程略。Postman接口調(diào)試工具(3)打開擴展程序工具打開GoogleChrome瀏覽器,進入主菜單,選擇“更多工具”→“擴展程序”,出現(xiàn)“擴展程序”頁面,打開右上角的“開發(fā)者模式”開關,點“加載已解壓的擴展程序”按鈕,如圖7.1所示。Postman接口調(diào)試工具(4)加載Postman彈出“選擇擴展程序目錄?!睂υ捒?,選中第(1)步Postman解壓后的存放目錄,點“選擇文件夾”按鈕?;氐健皵U展程序”頁面,可看到一個名為Postman的新的Chrome應用,如圖7.2所示。(5)安裝完成重新打開一個GoogleChrome瀏覽器窗口,點左上角“顯示應用”按鈕,出現(xiàn)“應用”頁面上可見Postman圖標,如圖7.3所示,說明安裝成功。

Postman接口調(diào)試工具(6)使用Postman點擊“應用”頁上的Postman圖標即可打開其主界面,如圖7.4所示。初次使用需要先注冊一個帳號,然后輸入用戶名密碼登錄進去。第7章REST風格接口開發(fā)——控制器注解開發(fā)REST接口SpringBoot實用教程(第4版)控制器注解開發(fā)REST接口SpringBoot的@RequestMapping注解能將URL地址映射到對應的控制器方法,那么只要把URI設計為符合REST風格規(guī)范,顯然開發(fā)出的接口也就是REST接口。不過,為了更方便地支持REST開發(fā),SpringBoot還提供了5個專門的注解,如下:@GetMapping:對應HTTP的GET請求,獲取資源。@PostMapping:對應HTTP的POST請求,創(chuàng)建資源。@PutMapping:對應HTTP的PUT請求,提交所有屬性以修改資源。@PatchMapping:對應HTTP的PATCH請求,提交部分屬性以修改資源。@DeleteMapping:對應HTTP的DELETE請求,刪除服務器端的資源。目錄01開發(fā)實例1.準備數(shù)據(jù)庫表2.創(chuàng)建項目3.配置連接4.開發(fā)實體5.開發(fā)持久層6.在控制器中開發(fā)REST接口開發(fā)實例【實例7.1】運用SpringBoot的控制器注解開發(fā)REST接口,實現(xiàn)對數(shù)據(jù)庫商品記錄的增刪改查操作。1.準備數(shù)據(jù)庫表本例使用MySQL數(shù)據(jù)庫中已經(jīng)存在的商品表,但由于SpringDataREST對表名長度的限制局限,為與下一節(jié)的實例共用同一個表(便于對比兩種模式開發(fā)的REST接口),將原商品表更名為commodit,同時為接口測試添加新商品的需要,往關聯(lián)的商家表和商品分類表中錄入兩條記錄,執(zhí)行語句:USEnetshop;INSERTINTOsupplier(SCode,SName,SWeiXin,Tel)VALUES('SHPD0A2B','萬享進貨通供應鏈(上海)有限公司','1889629850X','1889629850X');INSERTINTOcategoryVALUES('11G','車厘子');更名后的商品表及其中數(shù)據(jù)如圖7.5所示。開發(fā)實例2.創(chuàng)建項目創(chuàng)建SpringBoot項目,項目名為RestMap,在出現(xiàn)的向?qū)Ы缑妗癉ependencies”列表中勾選SpringBoot基本框架(“Web”→“SpringWeb”)、Lombok模型簡化組件(“DeveloperTools”→“Lombok”)、JPA框架(“SQL”→“SpringDataJPA”)以及MySQL的驅(qū)動(“SQL”→“MySQLDriver”)。此處引入JPA框架是因為:本例在底層(持久層)還是通過JPA操作MySQL的,而所開發(fā)的REST接口則是由控制器提供給前端(客戶端)訪問數(shù)據(jù)用的,并非系統(tǒng)自身在底層操作數(shù)據(jù)庫的接口,要注意這兩種接口是完全不同的概念。開發(fā)實例3.配置連接在項目的perties文件中配置對MySQL數(shù)據(jù)庫的連接,內(nèi)容如下:spring.datasource.url=jdbc:mysql://localhost:3306/netshop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.show-sql=truespring.jackson.serialization.indent-output=true

debug=true開發(fā)實例4.開發(fā)實體在項目工程目錄樹的com.example.restmap節(jié)點下創(chuàng)建entity包,其中創(chuàng)建更名后的商品表(commodit)實體類Commodit.java,代碼如下:packagecom.example.restmap.entity;

importcom.fasterxml.jackson.annotation.JsonIgnoreProperties;importlombok.Data;

importjavax.persistence.*;

@Entity@Data@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) //(a)publicclassCommodit{ @Id privateintpid; //商品號 privateStringtcode; //商品分類編碼 privateStringscode; //商家編碼 privateStringpname; //商品名稱 privatefloatpprice; //商品價格 privateintstocks; //商品庫存}開發(fā)實例5.開發(fā)持久層持久層只有一個JPA數(shù)據(jù)接口,用于獲取數(shù)據(jù)庫中的數(shù)據(jù)。在項目工程目錄樹的com.example.restmap節(jié)點下創(chuàng)建repository包,其中創(chuàng)建接口ComRepository.java,定義代碼為:packagecom.example.restmap.repository;

importcom.example.restmap.entity.Commodit;importorg.springframework.data.jpa.repository.JpaRepository;

publicinterfaceComRepositoryextendsJpaRepository<Commodit,Integer>{}6.在控制器中開發(fā)REST接口在項目工程目錄樹的com.example.restmap節(jié)點下創(chuàng)建controller包,其中創(chuàng)建控制器類ComController.java,代碼顯示。目錄02測試接口測試接口啟動當前項目,打開GoogleChrome瀏覽器,點窗口左上角“顯示應用”按鈕,在出現(xiàn)的“應用”頁面上點擊Postman圖標,啟動Postman進入其主界面。(1)根據(jù)商品號查詢單個商品記錄在Postman界面頂部URL欄輸入http://localhost:8080/restapi/commodits/1,請求的HTTP動作類型選為GET,點“Send”按鈕向接口發(fā)出請求,迅速得到響應獲取了1號商品記錄信息,如圖7.6所示。測試接口(2)查詢所有商品記錄在Postman的URL欄輸入http://localhost:8080/restapi/commodits,請求動作類型選GET,點“Send”按鈕,返回結(jié)果如圖7.7所示。(3)添加商品在Postman的URL欄輸入http://localhost:8080/restapi/commodits/1901/11G/SHPD0A2B/智利車厘子2斤大櫻桃整箱順豐包郵/59.80/5420,請求動作類型選POST,點“Send”按鈕,若添加成功則返回添加的商品記錄信息,如圖7.8所示。測試接口(4)更新庫存將剛添加的商品的庫存改為原來的十分之一,在Postman的URL欄輸入http://localhost:8080/restapi/commodits/1901/542,請求動作類型選PATCH,點“Send”按鈕,返回顯示的是修改后的商品記錄信息,如圖7.9所示。測試接口(5)刪除商品將剛添加的商品記錄刪除,在Postman的URL欄輸入http://localhost:8080/restapi/commodits/1901,請求動作類型選DELETE,點“Send”按鈕,返回消息“已刪除商品?!?,如圖7.10所示。第7章REST風格接口開發(fā)——SpringDataREST開發(fā)REST接口SpringBoot實用教程(第4版)目錄01開發(fā)實例1.創(chuàng)建項目2.配置連接3.開發(fā)實體4.開發(fā)持久層開發(fā)實例【實例7.2】運用SpringDataREST開發(fā)與上節(jié)【實例7.1】完全一樣的REST接口,實現(xiàn)對數(shù)據(jù)庫商品記錄的增刪改查操作。1.創(chuàng)建項目創(chuàng)建SpringBoot項目,項目名為RestData,在出現(xiàn)的向?qū)Ы缑妗癉ependencies”列表中勾選SpringBoot基本框架(“Web”→“SpringWeb”)、Lombok模型簡化組件(“DeveloperTools”→“Lombok”)、JPA框架(“SQL”→“SpringDataJPA”)以及MySQL的驅(qū)動(“SQL”→“MySQLDriver”)。開發(fā)實例為使項目支持REST服務,最重要的是添加SpringDataREST組件,勾選“Web”→“RestRepositories”,如圖7.11所示。開發(fā)實例2.配置連接在項目的perties文件中配置對MySQL數(shù)據(jù)庫的連接,內(nèi)容如下:spring.datasource.url=jdbc:mysql://localhost:3306/netshop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.show-sql=truespring.jackson.serialization.indent-output=true

spring.data.rest.base-path=/restapidebug=true開發(fā)實例3.開發(fā)實體本例的實體類可直接復用【實例7.1】的,在項目工程目錄樹的com.example.restdata節(jié)點下創(chuàng)建entity包,復制【實例7.1】的實體類源文件Commodit.java,改一下包路徑與當前項目一致即可,代碼略。4.開發(fā)持久層持久層也是只有一個JPA數(shù)據(jù)接口。在項目工程目錄樹的com.example.restdata節(jié)點下創(chuàng)建repository包,其中創(chuàng)建接口ComRepository.java,定義代碼為:packagecom.example.restdata.repository;

importcom.example.restdata.entity.Commodit;importorg.springframework.data.jpa.repository.JpaRepository;

publicinterfaceComRepositoryextendsJpaRepository<Commodit,Integer>{}目錄02測試接口測試接口啟動當前項目,打開GoogleChrome瀏覽器,啟動Postman進入其主界面。(1)查詢單個商品記錄在Postman的URL欄輸入http://localhost:8080/restapi/commodits/1,動作類型選GET,點“Send”按鈕發(fā)出請求,同樣得到了1號商品記錄信息,如圖7.12所示。與前圖7.6比較可見,基于SpringDataREST自動生成的REST接口所返回的記錄會被附加上一個“_links”屬性,其中包含指向該記錄(資源)的自鏈接地址。測試接口(2)查詢所有商品記錄在Postman的URL欄輸入http://localhost:8080/restapi/commodits,動作類型選GET,點“Send”按鈕,返回結(jié)果如圖7.13所示。測試接口例如,當前數(shù)據(jù)庫商品表里共有6條記錄,若只想查看中間2條,可將所有記錄分為3頁,每頁2條(size=2),顯示第1頁(分頁頁碼默認從0開始)。在Postman的URL欄輸入http://localhost:8080/restapi/commodits/?page=1&size=2,動作類型選GET,點“Send”按鈕發(fā)送,返回結(jié)果如圖7.14所示。測試接口SpringDataREST不僅返回了中間2條商品記錄,還在最后附加的“_links”屬性中列出了指向其

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論