您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何理解Java restful接口開發(fā)”,在日常操作中,相信很多人在如何理解Java restful接口開發(fā)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解Java restful接口開發(fā)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
1、RESTful 簡介
a>資源
b>資源的表述
c>狀態(tài)轉(zhuǎn)移
2、RESTful 的實(shí)現(xiàn)
3、HiddenHttpMethodFilter
4、RESTful 案例
4.1、需求
4.2、git 代碼位置
4.3、UserController
4.4、添加 HiddenHttpMethodFilter
4.5、測試效果
REST:Representational State Transfer,表現(xiàn)層資源狀態(tài)轉(zhuǎn)移。
資源是一種看待服務(wù)器的方式,即,將服務(wù)器看作是由很多離散的資源組成。每個(gè)資源是服務(wù)器上一個(gè)可命名的抽象概念。因?yàn)橘Y源是一個(gè)抽象的概念,所以它不僅僅能代表服務(wù)器文件系統(tǒng)中的一個(gè)文件、數(shù)據(jù)庫中的一張表等等具體的東西,可以將資源設(shè)計(jì)的要多抽象有多抽象,只要想象力允許而且客戶端應(yīng)用開發(fā)者能夠理解。與面向?qū)ο笤O(shè)計(jì)類似,資源是以名詞為核心來組織的,首先關(guān)注的是名詞。一個(gè) 資源可以由一個(gè)或多個(gè) URI 來標(biāo)識。URI 既是資源的名稱,也是資源在 Web 上的地址。對某個(gè)資源感興趣的客戶端應(yīng)用,可以通過資源的 URI 與其進(jìn)行交互。
資源的表述是一段對于資源在某個(gè)特定時(shí)刻的狀態(tài)的描述。可以在客戶端-服務(wù)器端之間轉(zhuǎn)移(交換)。資源的表述可以有多種格式,例如 HTML/XML/JSON/純文本/圖片/視頻/音頻等等。資源的表述格式可以通過協(xié)商機(jī)制來確定。請求-響應(yīng)方向的表述通常使用不同的格式。
狀態(tài)轉(zhuǎn)移說的是:在客戶端和服務(wù)器端之間轉(zhuǎn)移(transfer)代表資源狀態(tài)的表述。通過轉(zhuǎn)移和操作資源的表述,來間接實(shí)現(xiàn)操作資源的目的。
具體說,就是 HTTP 協(xié)議里面,四個(gè)表示操作方式的動詞:GET、POST、PUT、DELETE。
它們分別對應(yīng)四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來刪除資源。
REST 風(fēng)格提倡 URL 地址使用統(tǒng)一的風(fēng)格設(shè)計(jì),從前到后各個(gè)單詞使用斜杠分開,不使用問號鍵值對方式攜帶請求參數(shù),而是將要發(fā)送給服務(wù)器的數(shù)據(jù)作為 URL 地址的一部分,以保證整體風(fēng)格的一致性。
操作 | 傳統(tǒng)方式 | REST 風(fēng)格 |
---|---|---|
查詢操作 | getUserById?id=1 | user/1-->get 請求方式 |
保存操作 | saveUser | user-->post 請求方式 |
刪除操作 | deleteUser?id=1 | user/1-->delete 請求方式 |
更新操作 | updateUser | user-->put 請求方式 |
由于瀏覽器只支持發(fā)送 get 和 post 方式的請求,那么該如何發(fā)送 put 和 delete 請求呢?
SpringMVC 提供了 HiddenHttpMethodFilter
幫助我們將 POST 請求轉(zhuǎn)換為 DELETE 或 PUT 請求。
HiddenHttpMethodFilter
處理 put 和 delete 請求的條件:
當(dāng)前請求的請求方式必須為 post
前請求必須傳輸請求參數(shù)_method
滿足以上條件,HiddenHttpMethodFilter 過濾器就會將當(dāng)前請求的請求方式轉(zhuǎn)換為請求參數(shù)_method 的值,因此請求參數(shù)_method 的值才是最終的請求方式。
在 web.xml 中注冊 HiddenHttpMethodFilter
<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filterclass> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
使用注意:
目前為止,SpringMVC 中提供了兩個(gè)過濾器:CharacterEncodingFilter 和 HiddenHttpMethodFilter
在 web.xml 中注冊時(shí),必須先注冊 CharacterEncodingFilter,再注冊 HiddenHttpMethodFilter
原因:
在 CharacterEncodingFilter 中通過 request.setCharacterEncoding(encoding) 方法設(shè)置字符集的
request.setCharacterEncoding(encoding) 方法要求前面不能有任何獲取請求參數(shù)的操作而 HiddenHttpMethodFilter 恰恰有一個(gè)獲取請求方式的操作:
String paramValue = request.getParameter(this.methodParam);
通過 restfull 實(shí)現(xiàn)用戶的增刪改查,需要提供 5 個(gè)接口。
接口 | method | 描述 |
---|---|---|
/user/list | GET | 獲取用戶列表 |
/user/{userId} | GET | 根據(jù)用戶 id 獲取用戶信息 |
/user | POST | 新增用戶信息 |
/user | PUT | 保存用戶信息 |
/user/{userId} | DELETE | 刪除用戶信息 |
https://gitee.com/javacode2018/springmvc-series
UserController 中實(shí)現(xiàn)了需求中提到的 4 個(gè)接口,大家重點(diǎn)看下每個(gè)接口的方法上用到的注解。
@RestController public class UserController { private List<User> userList = new ArrayList<>(); { userList.add(new User(1, "Spring高手系列")); userList.add(new User(2, "SpringMVC系列")); } @GetMapping("/user/list") public List<User> list() { System.out.println("list()"); return userList; } @GetMapping("/user/{userId}") public User getUser(@PathVariable("userId") Integer userId) { System.out.println("getUser()"); for (User user : userList) { if (user.getUserId().equals(userId)) { return user; } } return null; } @PostMapping(value = "/user", produces = "text/html;charset=UTF-8") public String add(User user) { System.out.println("add()"); this.userList.add(user); return "新增成功"; } @PutMapping(value = "/user", produces = "text/html;charset=UTF-8") public String modify(User user) { System.out.println("modify()"); for (User item : userList) { if (item.getUserId().equals(user.getUserId())) { item.setName(user.getName()); } } return "修改成功"; } @DeleteMapping(value = "/user/{userId}", produces = "text/html;charset=UTF-8") public String delete(@PathVariable("userId") Integer userId) { System.out.println("delete()"); Iterator<User> iterator = userList.iterator(); while (iterator.hasNext()) { User user = iterator.next(); if (user.getUserId().equals(userId)) { iterator.remove(); } } return "刪除成功"; } public static class User { private Integer userId; private String name; public User() { } public User(Integer userId, String name) { this.userId = userId; this.name = name; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "userId=" + userId + ", name='" + name + '\'' + '}'; } } }
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
將項(xiàng)目發(fā)布到 tomcat,如下圖,跑一下 UserController.http 中的 5 個(gè)用例,點(diǎn)擊每個(gè)用戶中的綠色箭頭即可運(yùn)行,注意下后面 3 個(gè)用例都是 POST 方式提交的,但是參數(shù)中多了一個(gè)_method 參數(shù)用來指定提交的類型,這個(gè)參數(shù)會被HiddenHttpMethodFilter 解析。
到此,關(guān)于“如何理解Java restful接口開發(fā)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(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)容。