學(xué)習(xí)視頻:【編程不良人】2021年SpringBoot最新最全教程
第十六章、RestFul API
-
什么是REST
REST 全稱(chēng)是 Resource Representational State Transfer,中文意思是表述性狀態(tài)轉(zhuǎn)移,它首次出現(xiàn)在2000年Roy Fielding的博士論文中,Roy Fielding是HTTP規(guī)范的主要編寫(xiě)者之一。他在論文中表示:我這篇文章的目的就是想在符合架構(gòu)原理的前提下,理解和評(píng)估以網(wǎng)絡(luò)為基礎(chǔ)的應(yīng)用軟件的架構(gòu)設(shè)計(jì),得到一個(gè)功能強(qiáng)、性能好、適宜通信的架構(gòu)。REST指的是一組架構(gòu)約束條條件和原則,“如果一個(gè)架構(gòu)復(fù)合REST的約束條件和原則,我們就稱(chēng)它為RESTful架構(gòu)”
RestFul:是一種以網(wǎng)絡(luò)為基礎(chǔ)構(gòu)架一種架構(gòu)一種架構(gòu)風(fēng)格,一個(gè)符合Rest設(shè)計(jì)原則和約束成這個(gè)架構(gòu)為RestFul。
REST本身并沒(méi)有創(chuàng)造新的技術(shù)、組件和服務(wù)、而隱藏在RESTful背后的理念就是使用web的現(xiàn)有特征和能力,更好地使用現(xiàn)有web標(biāo)準(zhǔn)中的一些準(zhǔn)則和約束。
-
RestFul遵循的架構(gòu)約束
- 客戶(hù)端-服務(wù)器架構(gòu):由客戶(hù)端、服務(wù)器和資源組成,通過(guò)HTTP管理請(qǐng)求。
- 無(wú)狀態(tài)的客戶(hù)端-服務(wù)器通信:每個(gè)請(qǐng)求都是獨(dú)立的,不會(huì)在請(qǐng)求之間保存客戶(hù)端信息。
- 可緩存的數(shù)據(jù):通過(guò)緩存數(shù)據(jù)來(lái)優(yōu)化客戶(hù)端-服務(wù)器交互。
- 統(tǒng)一的接口:信息以標(biāo)準(zhǔn)形式傳輸,包括資源的標(biāo)識(shí)和表示之間的分離,以及自描述的消息返回給客戶(hù)端。
-
總結(jié)
RestFul是一種架構(gòu)風(fēng)格,不是標(biāo)準(zhǔn),只是提供了一組設(shè)計(jì)原則和約束條件,它主要用于客戶(hù)端和服務(wù)器交互類(lèi)的軟件,基于這個(gè)風(fēng)格設(shè)計(jì)的軟件可以更簡(jiǎn)潔、更有層次,更易于實(shí)現(xiàn)緩存等機(jī)制。
-
URL定義
- 資源:互聯(lián)網(wǎng)所有的事務(wù)都可以稱(chēng)為資源:一張圖片、一段文本、一條記錄…..
- 資源操作:使用POST添加、DELETE刪除,PUT修改,GET查詢(xún),使用不同請(qǐng)求方法對(duì)資源進(jìn)行操作
- 刪除 delete
- 查詢(xún) get
- 添加 post
- 修改 put(修改全部字段) patch(更新部分字段)
-
傳統(tǒng)方式操作資源
- http://127.0.0.1/item/queryUser.action?id=1 查詢(xún) GET
- http://127.0.0.1/item/saveUser 新增 POST
- http://127.0.0.1/item/updateUser.action 更新 PUT
- http://127.0.0.1/item/deleteUser.action?id=1 刪除 DELETE
注意:傳統(tǒng)的操作是沒(méi)有問(wèn)題的,大神認(rèn)為有問(wèn)題的:你每次請(qǐng)求的接口或者地址都是在做描述,其實(shí)完全沒(méi)有這個(gè)必要,我使用了get請(qǐng)求,就是代表查詢(xún),使用post就是代表新增請(qǐng)求,我的意圖很明顯,完全沒(méi)有必要做描述,這就是為什么有了restful。
-
使用RESTful操作資源
- 【GET】 /users 查詢(xún)用戶(hù)信息列表
- 【GET】 /users/1001 查看某個(gè)用戶(hù)信息
- 【POST】 /users 新增用戶(hù)信息
- 【PUT】 /users/1001 更新用戶(hù)信息(全部字段)
- 【PATCH】 /users/1001 更新用戶(hù)信息(部分字段)
- 【DELETE】 /users/1001 刪除用戶(hù)信息
第一個(gè)RestFul風(fēng)格的API
@RestController // 專(zhuān)用于restful風(fēng)格的注解,只能返回json/Xml格式的數(shù)據(jù)
@RequestMapping("/v1/users")
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
/**
* 獲取單個(gè)用戶(hù)
* @param id
* @return
*/
@GetMapping("/{id}")
public User user(@PathVariable("id") Integer id) {
log.info("id:{}", id);
return new User(21, "小明", 2000.2, new Date());
}
/**
* 用戶(hù)列表
* @return
*/
@GetMapping()
public List<User> users() {
ArrayList<User> users = new ArrayList<>();
users.add(new User(21, "小明", 2000.2, new Date()));
users.add(new User(16, "小紅", 3000.2, new Date()));
return users;
}
/**
* 添加用戶(hù)
* @param user
*/
@PostMapping
public void saveUser(@RequestBody User user) {
log.info("用戶(hù)信息:{}", user);
//調(diào)用業(yè)務(wù)方法...
}
/**
* 修改用戶(hù)
* @param user
*/
@PutMapping("/{id}")
public void update(@PathVariable("id") Integer id, @RequestBody User user) {
log.info("更新用戶(hù)的id:{}",id);
log.info("修改信息:{}", user);
//調(diào)用業(yè)務(wù)方法...
}
/**
* 刪除用戶(hù)
* @param id
*/
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") Integer id) {
log.info("id:{}",id);
}
}
**@RestController 注解**
**@RestController**
注解則是用來(lái)創(chuàng)建 REST API 控制器的。在 REST API 中,通常需要返回 JSON 或 XML 格式的數(shù)據(jù),而不是 HTML 視圖。因此,@RestController
注解結(jié)合了 @Controller
和 @ResponseBody
注解的功能,可以方便地實(shí)現(xiàn) REST API 的開(kāi)發(fā)。
@RequestBody 注解
@RequestBody
?注解將請(qǐng)求體中的 JSON 數(shù)據(jù)轉(zhuǎn)換為 Java 對(duì)象。
**@PathVariable注解**
這個(gè)注解用于處理RESTful API中的URL路徑參數(shù)。例如**@GetMapping("/{id}")
** ,我們需要使用@PathVariable
注解來(lái)提取URI中的{id},并將其作為方法的參數(shù)。
@PathVariable
還有一些屬性可以使用:
-
指定路徑變量的名稱(chēng):?如果路徑變量的名稱(chēng)與方法參數(shù)的名稱(chēng)不同,我們可以在
@PathVariable
注解中指定路徑變量的名稱(chēng)。@GetMapping("/api/employees/{empId}") public String getEmployeeById(@PathVariable("empId") String id) { return "ID: " + id; }
-
指定默認(rèn)值:?我們還可以在@PathVariable注解中指定默認(rèn)值,以防路徑變量未提供。
@GetMapping("/api/employees/{id}") public String getEmployeeById(@PathVariable(name = "id", required = false, defaultValue = "0") String id) { return "ID: " + id; }
-
如果業(yè)務(wù)邏輯還要往深一層查,比如查某個(gè)人的某個(gè)寵物,那么可以這樣
/** * 獲取某個(gè)人的所有寵物信息 */ @GetMapping("/{id}/pets") public List<Pet> pets(@PathVariable("id") Integer id) { log.info("查詢(xún)?nèi)说膇d:{}", id); return Arrays.asList(new Pet(2, "旺財(cái)", 2),new Pet(3,"花花",1)); } /** * 獲取某個(gè)人的某個(gè)寵物信息 */ @GetMapping("/{id}/pets/{pid}") public Pet pets(@PathVariable("id") Integer id,@PathVariable("pid") Integer pid) { log.info("查詢(xún)?nèi)说膇d:{}", id); Pet pet = new Pet(2, "旺財(cái)", 2); return pet; }
ResponseEntity 和 HttpStatus
ResponseEntity
代表了整個(gè) HTTP 響應(yīng),包括狀態(tài)碼、頭部信息和響應(yīng)體??梢酝耆渲?HTTP 響應(yīng)。ResponseEntity
提供了泛型,所以我們可以使用它來(lái)代替API中的返回值
-
示例文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-760634.html
//ResponseEntity springmvc中用于restful響應(yīng)類(lèi),可以提供響應(yīng)的狀態(tài)碼,以及自定義響應(yīng)頭信息 // HttpStatus:springmvc提供的枚舉類(lèi)型類(lèi) 網(wǎng)絡(luò)狀態(tài)碼 /** * 獲取單個(gè)用戶(hù) */ @GetMapping("/{id}") public ResponseEntity<User> user(@PathVariable("id") Integer id) { log.info("id:{}", id); User user = new User(21, "小明", 2000.2, new Date()); return new ResponseEntity<>(user, HttpStatus.OK);// 狀態(tài)碼:200 } /** * 用戶(hù)列表 */ @GetMapping() public ResponseEntity<List<User>> users() { ArrayList<User> users = new ArrayList<>(); users.add(new User(21, "小明", 2000.2, new Date())); users.add(new User(16, "小紅", 3000.2, new Date())); return new ResponseEntity<>(users,HttpStatus.OK);// 狀態(tài)碼:200 } /** * 添加用戶(hù) */ @PostMapping public ResponseEntity<Void> saveUser(@RequestBody User user) { log.info("用戶(hù)信息:{}", user); //調(diào)用業(yè)務(wù)方法... return new ResponseEntity<>(HttpStatus.NO_CONTENT);//沒(méi)有內(nèi)容,狀態(tài)碼204 }
下一章:Spring Boot學(xué)習(xí)隨筆- 后端實(shí)現(xiàn)全局異常處理(HandlerExceptionResolver),前后端解決跨域問(wèn)題(@CrossOrigin(局部解決)自定義跨域配置類(lèi)(全局))文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-760634.html
到了這里,關(guān)于Spring Boot學(xué)習(xí)隨筆- RestFul API(@RestController、@RequestBody、@PathVariable),使用ResponseEntity+HttpStatus作為返回值的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!