基於MVC的RESTFul風格API實戰

基於MVCRESTful風格的實現

1.RESTful風格闡述

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

==良好的REST API不須要任何文檔==java

1.1REST風格資源路徑

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

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

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

1.2HTTP方法
GET用於==讀取==、==檢索==、==查詢==、==過濾==資源

PSOT用於==建立==一個資源apache

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

DELETE用於==刪除==資源tomcat

資源地址和HTTP方法結合在一塊兒就能夠實現對資源的完整定位服務器

1.3RESTful風格API設計

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

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

功能 描述
添加/建立 POST/users
PUT/users{id}1
刪除 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方法==來實現對資源不一樣的處理。maven

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);
    }
}

更多原創文章和Java學習資料@公衆號MakerStack


  1. 建立客戶端維護主鍵信息的資源
相關文章
相關標籤/搜索