<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Restful比較熱門,,Spring的微服務是基於Restful風格搭建的框架。
Restful有一下幾個特點:
最簡單的,最常用的GET請求,用於查詢全部資料或者其中一條資料的詳情。
常用註解 | 作用 |
---|---|
@RestController | 表明此tController 提供的是Restful服務 |
@RequestMapping | 將URL對映到Java |
@RequestParam | 對映請求引數到Java上的引數 |
@PageableDefault | 指定分頁引數的預設值 |
@RequestMapping(value="/manage", method= {RequestMethod.GET}) public String list(String userId,Map<String,Object> map) { if(userId==""||userId==null) { map.put("userList", userService.getUserList()); }else { map.put("userList",userService.getUserById(Integer.parseInt(userId))); } return "user/list"; }
用於接收前端傳遞給後端的json字串中的資料。(處理json格式的資料)
@RequestBody用來接收前端傳遞給後端的json字串中的資料,GET方式的請求一般通過URL中攜帶key-value引數,而@RequestBody接收的是請求體中的資料(json格式的資料,只有請求體中能儲存json),所以使用@RequestBody接收資料的時候必須是POST方式等方式。
@RequestBody與@RequestParam()可以同時使用,但@RequestBody最多隻能有一個,而@RequestParam()可以多個。
(@RequestBody Map map) (@RequestBody Object object)
(@RequestBody Map map)先對簡單,將json解析成Map形式的key-value對,直接通過map.get(“KeyName”)就能拿到值了
(@RequestBody Object object) 通過json字串中的key來匹配對應實體類的屬性如果匹配一致且json中的該key對應的值符合實體類的對應屬性的型別要求時,會呼叫實體類的setter方法將值注入到該屬性。
例如
public Result deleteBookById(@RequestBody HashMap<String, String> map) { this.bookService.deleteBookById(Long.parseLong(map.get("id"))); return Result.createWithSuccessMessage(); } public Result updateBookById(@RequestBody Book book){ Book record = this.bookService.updateBookById(book); return Result.createWithModel(record); }
注意:
在(@RequestBody Object object)中,前端POST過來的資料會通過反序列資料到實體類中,並且在反序列的過程中會進行型別的轉換。
在json中應該用null來代表空值,如果是"“(空字串)會判斷為空串,如果實體類屬性是String型別的,那麼接受到的就是”",如果實現類屬性型別是Integer、Double等型別,那麼接收到的就是null。
{ name:"", age:null }
(@RequestBody Object object)內部是通過傳遞過來的資料中的Key尋找setter方法,有則呼叫,無則不作任何操作(其實可以設計)。
如果通過Key匹配到setter方法,但是Value無法轉換為對應的範例類屬性的型別時,丟擲異常。
前端傳入日期格式: yyyy-MM-dd HH:mm:ss,例如:2018-07-09 12:55:12(不使用時間戳,前後雙方聯調時檢視起來更加友好)
後端返回日期格式: yyyy-MM-dd HH:mm:ss,例如:2018-07-09 12:55:12(不使用時間戳,前後雙方聯調時檢視起來更加友好)
後端json序列化、反序列化框架: 定義任何一種高效的json工具都行,例如:Fastjson、Gson、Jackson lib
序列化、反序列化日期格式規範: pattern=”yyyy-MM-dd HH:mm:ss”,timezone = “GMT+8”,除特出場景可以使用pattern=”yyyy-MM-dd”,timezone = “GMT+8”
不要隨意自定義convert處理日期格式以及其他特殊格式轉換,應該交由基礎框架組或架構組統一在框架層面解決,對業務開發透明,或者在有些小公司由Leader或高開來擔當。
/* * 新增使用者,使用@RequestBody將請求體對映到Action方法引數中 * 使用@Valid註解驗證請求引數的合法性 * 使用BindingResult處理校驗結果 * @param user * @param result * @return */ @PostMapping("/user") public User create(@Valid @RequestBody User user, BindingResult result){ if(result.hasErrors()){ result.getAllErrors().stream().forEach(error -> { FieldError fieldError = (FieldError)error; String message = fieldError.getField() + " " + error.getDefaultMessage(); System.out.println(message); }); return null; } System.out.println(user.toString()); user.setId(5l); return user; }
PUT和DELETE並不複雜,大家也熟悉,用於對後臺資料的更新和刪除。
對資源更新的請求方法通常是是PUT,但有時候也可能是POST。那麼問題來了,都是更新資源區別在哪裡?
PUT | POST |
---|---|
在HTTP中PUT被定義為冪等的請求方法 | 而POST則不是 |
操作是作用於一個具體資源之上 | 作用於一個集合資源之上 |
URL在使用者端確定使用PUT | URL在伺服器端確定使用POST |
比較直觀的是資源URL的不同
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/jquery.min.js"></script> <script> $(function () { // 查詢所有 $('#btn1').click(function () { $.get('/employees', function (data) { console.log(data); }); }); // 查詢一個 $('#btn2').click(function () { $.get('/employees/10', function (data) { console.log(data); }); }); // 新增 $('#btn3').click(function () { $.post('/employees', "id=11", function (data) { console.log(data); }); }); // 修改 $('#btn4').click(function () { $.ajax({ url: "/employees", type: "PUT", data: {id: 1, name: "小肥羊", age: 10}, success: function (data) { console.log(data); } }); }); // 刪除 $('#btn5').click(function () { $.ajax({ url: "/employees/13", type: "DELETE", data: {id: 1}, success: function (data) { console.log(data); } }); }); }); </script> </head> <body> <button id="btn1">查詢所有</button> <button id="btn2">查詢一個</button> <button id="btn3">新增</button> <button id="btn4">修改</button> <button id="btn5">刪除</button> </body> </html>
package com.yy.web.controller; import com.yy.domain.Employee; import com.yy.util.JsonResult; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Repository; import org.springframework.web.bind.annotation.*; import java.util.Arrays; import java.util.List; /** * @program: restful-demo * @ClassName: EmployeeController * @description: * @author: YanYang * @create: 2021-06-23 15:04 **/ @RestController @RequestMapping("employees") public class EmployeeController { /** * 2個介面設計都是用相同資源,相同請求方法,此時 SpringMVC 無法識別, * 認為是同一方法,報錯:Ambiguous mapping. [模糊對映] * * RESTful 解決方案:使用 引數路徑 方式 * 具體實現:將引數作為請求對映路徑一部分,[參與對映路徑區分] * 比如:查詢指定 id 的員工資訊介面設計 * @RequestMapping(value = "/employees/{id}", method = RequestMethod.GET) * 其中 "/employees/{id}" 引數路徑,{id} 就是路徑引數 * * 存取該介面時:http:localhost:8080/employees/1 其中 1 是 id 引數 * 介面接收路徑引數:使用 @PathVariable,表示將引數路徑上的引數解析,並賦值給指定變數 * 如果路徑引數與變數名不一致,使用 @PathVariable("eid")明確指定 * */ // 查詢所有(資料是模擬的) // @RequestMapping(value = "/employees", method = RequestMethod.GET) @GetMapping public List<Employee> list() { return Arrays.asList(new Employee(1L,"小肥羊", 10), new Employee(2L, "熊大", 11)); } // 查詢單個(資料是模擬的) // @RequestMapping(value = "/employees/{id}", method = RequestMethod.GET) @GetMapping("/{eid}") public Employee queryById(@PathVariable("eid") Long id) { System.out.println("查詢單個 = " + id); return new Employee(3L, "熊二", 8); } // 新增(資料是模擬的) // @RequestMapping(value = "/employees", method = RequestMethod.POST) @PostMapping public Employee add(@ModelAttribute("employee") Employee employee) { System.out.println("新增 = " + employee.getId()); return employee; } // 修改(資料是模擬的) // @RequestMapping(value = "/employees", method = RequestMethod.PUT) @PutMapping public Employee update(@ModelAttribute("employee") Employee employee) { System.out.println("修改 = " + employee.getId()); employee.setId(employee.getId()); employee.setName(employee.getName()); employee.setAge(employee.getAge()); return employee; } // 刪除(資料是模擬的) // @RequestMapping(value = "/employees/{id}", method = RequestMethod.DELETE) @DeleteMapping("/{id}") public String delete(@PathVariable Long id) { System.out.println("刪除 = " + id); if (id != null && 1 == id) { return "刪除成功"; } return "刪除失敗"; } }
到此這篇關於SpringBoot RESTful介面入門講解的文章就介紹到這了,更多相關SpringBoot RESTful內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45