基於MVC的RESTful風格的實現


基於MVCRESTful風格的實現

1.RESTful風格闡述

REST服務是一種ROA(Resource-Oriented Architecture,面向資源的架構)應用。主要特點是方法信息存在於HTTP協議的方法中(GET,POST,PUT,DELETE),作用域存在於URL中。例如,在一個獲取設備資源列表的GET請求中,方法信息是GET,作用域信息是URI種包含的對設備資源的過濾、分頁和排序等條件

良好的REST API不需要任何文檔

1.1REST風格資源路徑

REST風格的資源路徑設計是面向資源的,資源的名稱應該是准確描述該資源的名詞

資源路徑概覽:sheme://host:port/path?queryString

例:http://localhost:8080/bywlstudio/users/user?username=xiuer

1.2HTTP方法

GET用於讀取檢索查詢過濾資源

PSOT用於創建一個資源

PUT用於修改更新資源、創建客戶端維護主鍵信息的資源

DELETE用於刪除資源

資源地址和HTTP方法結合在一起就可以實現對資源的完整定位

1.3RESTful風格API設計

上文講述了通過HTTP方法和資源路徑對服務器的一個資源進行定位的過程

接下來看一個REST風格API的設計

功能 描述
添加/創建 POST/users PUT/users{id}創建客戶端維護主鍵信息的資源
刪除 DELETE/users/{id}
修改/更新 PUT/users/{id}
查詢全部 GET/users
主鍵查詢 GET/users/{id} GET/users?id=26
分頁作用域查詢 GET/users?start=0&size=10 GET/users?07,2019-07,2020

可以看到通過這個RESTAPI都是通過對同一個資源的操作,所不同的就是通過不同的HTTP方法來實現對資源不同的處理。

2.MVCREST的支持

1.1主要通過注解來實現
  • @Controller聲名一個處理請求的控制器

  • @RequestMapping請求映射地址,它存在幾個子注解對於實現REST風格來說更加具有語義性

    • @GETMapping GET請求

    • @PUTMapping PUT請求

    • @POSTMapping POST請求

    • @DELETEMapping DELETE請求

  • @ResponseBody 將響應內容轉換為JSON格式

  • @RequestBody 請求內容轉換為JSON格式

  • @PathVariable("id")用於綁定一個參數

  • @RESTController 等同於@Controller+@ResponseBody在類上寫了這個注解,標識這個類的所有方法只返回數據,而不進行視圖跳轉

1.2返回HTTP狀態碼

REST風格API一個最鮮明的特點通過返回對應的HTTPStatus來判斷客戶端的操作是否完成

下面是spring中關於Http狀態碼描述的枚舉類,本文列舉了常見的狀態碼(讀者若對此感興趣可以查看HttpStatus源碼)

 public enum HttpStatus{
     OK(200, "OK"),//用於服務器有實體響應
     CREATED(201, "Created"),//創建了新實體,響應該實體
     NO_CONTENT(204, "No Content"),//服務器正常響應,但無實體響應
     BAD_REQUEST(400, "Bad Request"),//客戶端請求語法錯誤
     NOT_FOUND(404, "Not Found"),//目標資源不存在
     INTERNAL_SERVER_ERROR(500, "Internal Server Error"),//服務器內部錯誤
     NOT_IMPLEMENTED(501, "Not Implemented"),//服務器不支持當前請求
 }

Spring返回狀態碼是通過@ResponseStatus注解或者ResponseEntity<?>類實現的。

@ResponseStatus方式

 @GetMapping(path = "/user/{id}" , produces = "application/json;charset=utf-8")
 @ResponseStatus(HttpStatus.OK)
 public User findUserById(@PathVariable("id")Integer id){
     User user = userService.findUserById(id);
     return user ;
 }

ResponseEntity<?>方式

 @GetMapping(produces = "application/json;charset=utf-8")
 public ResponseEntity<List<User>> findAll(){
     List<User> users = userService.findAll();
     return new ResponseEntity<List<User>>(users , HttpStatus.OK);
 }
1.3由於MVC默認不支持PUTDELETE方法,所以需要手動開啟

tomcat服務器的web.xml文件中開啟一下配置

 <servlet>
  <servlet-name>default</servlet-name>
  <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  <init-param>
  <param-name>debug</param-name>
  <param-value>0</param-value>
  </init-param>
  <init-param>
  <param-name>listings</param-name>
  <param-value>false</param-value>
  </init-param>
  <init-param>
         <param-name>readonly</param-name>
         <param-value>true</param-value><!--開啟這個-->
  </init-param>
  <load-on-startup>1</load-on-startup>
  </servlet>

在項目的web.xml中配置

 <filter>
     <filter-name>HiddenHttpMethodFilter</filter-name>
     <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
   </filter>
 
   <filter-mapping>
     <filter-name>HiddenHttpMethodFilter</filter-name>
     <servlet-name>dispathcherServlet</servlet-name>
   </filter-mapping>

3.MVC實現REST代碼實現

3.1實例環境
  • JDK1.8

  • maven3.60

  • tomcat9

3.2API設計
URI Description Response HTTPStatus
GET/users 獲取全部用戶 JSON 200
GET/users/{id} 獲取指定主鍵的用戶 JSON 200
PUT/users/{id} 修改指定的主鍵的用戶信息 JSON 200/201
POST/users 增加一個用戶 JSON 201
DELETE/users/{id} 刪除一個用戶 void 204
3.3控制層代碼
 @RestController
 @RequestMapping("/users")
 public class UserControler {
 
     @Autowired
     private IUserService userService ;
 
     //REST風格實現方法
 
     /**
      * 查詢所有
      * @return
      */
     @GetMapping(produces = "application/json;charset=utf-8")
     public ResponseEntity<List<User>> findAll(){
         List<User> users = userService.findAll();
         return new ResponseEntity<List<User>>(users , HttpStatus.OK);
    }
 
     /**、
      * 根據ID查詢
      * @param id
      * @return
      */
 
     @GetMapping(path = "/{id}" , produces = "application/json;charset=utf-8")
     @ResponseStatus(HttpStatus.OK)
     public User findUserById(@PathVariable("id")Integer id){
         User user = userService.findUserById(id);
         return user ;
    }
     /**
      * 增加一個用戶
      * 返回該用戶
      */
     @PostMapping(produces = "application/json;charset=utf-8")
     @ResponseStatus(HttpStatus.CREATED)
     public User addUser(@RequestBody User user){
         User newUser = userService.addUser(user);
         return newUser ;
    }
 
     /**
      * 更新
      * @param user
      */
     @PutMapping(path = "/{id}" ,produces = "application/json;charset=utf-8")
     public ResponseEntity<User> updateUser(@PathVariable("id") Integer id , @RequestBody User user){
         user.setUid(id);
         //資源是否修改
         boolean flag = userService.updateUser(user);
         User deUser = userService.findUserById(id);
         if(flag)
             return new ResponseEntity<User>(deUser,HttpStatus.CREATED);
         return new ResponseEntity<User>(deUser,HttpStatus.OK);
    }
 
     @DeleteMapping(path = "/{id}" , produces = "application/json;charset=utf-8")
     @ResponseStatus(HttpStatus.NO_CONTENT)
     public void delUser(@PathVariable("id") Integer id){
         User user = userService.findUserById(id);
         userService.delUser(id);
    }
 }

本文項目地址:https://github.com/946470326/MakerStack/tree/ssm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM