1. 概述
RESTful架構風格規定,數據的元操作,即CRUD(增刪查改)操作,分別對應於HTTP方法:GET用來獲取資源,POST用來新建資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源,這樣就統一了數據操作的接口,僅通過HTTP方法,就可以完成對數據的所有增刪查改工作。
- GET(SELECT):從服務器取出資源(一項或多項)。
- POST(CREATE):在服務器新建一個資源。
- PUT(UPDATE):在服務器更新資源(客戶端提供完整資源數據)。
- PATCH(UPDATE):在服務器更新資源(客戶端提供需要修改的資源數據)。
- DELETE(DELETE):從服務器刪除資源。
本文中例子RESTful API具體設計如下:
2. 本節重點
- RESTful風格介紹
- 使用SpringBoot,快速搭建RESTful風格Web服務
3. 工具
- IntelliJ IDEA,直接官網下載,Ultimate版本,傻瓜式安裝
- Maven,IntelliJ IDEA自帶無需安裝
- Springboot ,版本2.0.3.RELEASE
- Postman,測試工具,解壓無需安裝
4. 代碼分析
新建User實體類
public class User { private Integer userId; private String name; private Integer age; private String address; // 省略 get set方法}
快捷鍵Alt+Insert,可以生成構造器/Getter/Setter等
新建DAO層,查詢數據庫,這裡為了簡單用Map模擬
@Componentpublic class UserDao { // 數據層:查詢數據庫,這裡為了簡單用Map模擬 private static Integer count = 0; // 線程安全的Map private static MapuserMap = Collections.synchronizedMap(new HashMap<>()); static { // 靜態代碼塊,第一次初始化類時被調用 // 初始化userMap userMap.put(++count, User.builder().userId(count).name("Mkeeper").age(28).address("wuhan").build()); userMap.put(++count, User.builder().userId(count).name("Jam").age(22).address("beijing").build()); userMap.put(++count, User.builder().userId(count).name("Li").age(18).address("shanghai").build()); } public User findByUserId(Integer userId){ return userMap.get(userId); } public List findList(){ return new ArrayList<>(userMap.values()); } public User addUser(User user){ user.setUserId(++count); userMap.put(count, user); return user; } public User updateUser(User user){ userMap.put(user.getUserId(), user); return user; } public boolean deleteByUserId(Integer userId){ userMap.remove(userId); return true; }}
新建service層,包括接口與實現
public interface UserService { // 服務層:處理業務邏輯 User findByUserId(Integer userId); ListfindList(); User addUser(User user); User updateUser(User user); boolean deleteByUserId(Integer userId);}@Servicepublic class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User findByUserId(Integer userId) { return userDao.findByUserId(userId); } @Override public List findList() { return userDao.findList(); } @Override public User addUser(User user) { return userDao.addUser(user); } @Override public User updateUser(User user) { return userDao.updateUser(user); } @Override public boolean deleteByUserId(Integer userId) { return userDao.deleteByUserId(userId); }}
新建操作user的接口
@RequestMapping("/users")@RestControllerpublic class UserController { // 入口:處理相應URL @Autowired private UserService userService; @GetMapping("/{userId}") public User findByUserId(@PathVariable Integer userId){ // 處理“/users/{userId}”的Get請求,獲取user信息 // url中的id可通過@PathVariable綁定到函數的參數中 return userService.findByUserId(userId); } @GetMapping("/") public ListfindList(){ // 處理“/users/”的Get請求,獲取用戶列表信息 // 還可以通過@RequestParam從頁面中傳遞參數來進行查詢條件或者翻頁信息的傳遞 return userService.findList(); } @PostMapping("/") public User addUser(@RequestBody User user){ // 處理"/users/"的POST請求,用來創建User // 除了@RequestBody綁定參數之外,還可以通過@RequestParam從頁面中傳遞參數 return userService.addUser(user); } @PutMapping("/") public User updateUser(@RequestBody User user){ // 處理"/users/{id}"的PUT請求,用來更新User信息 return userService.updateUser(user); } @DeleteMapping("/{userId}") public boolean deleteByUserId(@PathVariable Integer userId){ // 處理"/users/{id}"的DELETE請求,用來刪除User return userService.deleteByUserId(userId); }}
推薦一個查詢URL的快捷鍵:Ctrl+Shift+Alt+N,然後輸入url,可以快速查找對應Controller;該快捷鍵還可以查方法。
測試結果,這裡只展示新增的測試結果,其他接口測試還請讀者自行實踐
5. 工程目錄
6. 結束語
微服務盛行,RESTful風格接口大行其道,實踐後,才知道其實不復雜,原理是一樣的。有任何建議,歡迎留言探討。
本文源碼:github(Mkeeper666),gitee(Mkeeper)
閱讀更多 Mkeeper 的文章