1. 程式人生 > >RESTful 的基本認識

RESTful 的基本認識

在很早之前接觸 Spring MVC 的時候,都知道 Spring MVC 支援 RESTful 風格API的開發,但對於 RESTful 只是有個模糊的認識,以至於甚至在開發寫出來的介面其實不符合 RESTful 的要求。

定義

REST 的全稱是 Resource Representational State Transfer ,資源以某種表現形式進行狀態轉移
Resource:資源,即資料;
Representational:某種表現形式,比如用JSON,XML,JPEG等;
State Transfer:狀態變化。通過HTTP動詞實現。

HTTP動詞有如下幾個:
- GET 用來獲取資源,
- POST 用來新建資源(也可以用於更新資源),
- PUT 用來更新資源,
- DELETE 用來刪除資源

用處

一種技術的存在肯定是為了解決一些問題而誕生的,REST是一種軟體架構模式,通過使用RESTful 風格的 API 用來解決多端(PC、Android、IOS)共用一套統一的 API ,避免重複開發。

在 SpringMVC 中的應用

用 SpringMVC 可以開發 restful 風格的restful api,以 Spring Boot 為基本框架,這裡寫一個基本的 controller 類

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
UserService userService; @RequestMapping(value="{id}", method=RequestMethod.GET) public String getUserById(@PathVariable("id") String userId) { return ResultUtil.success(userService.getUserById(userId), "操作成功"); } @RequestMapping(value="{id}", method=RequestMethod.PUT) public
String updateUser(@PathVariable("id") String userId) { int num = userService.updateUser(userId); if (1==num){ return ResultUtil.success("操作成功"); } else return ResultUtil.error("操作失敗"); } @RequestMapping(method=RequestMethod.POST) public String insertUser(String userCode, String userName) { int num = userService.insertUser(userCode, userName); if (1==num){ return ResultUtil.success("操作成功"); } else return ResultUtil.error("操作失敗"); } @RequestMapping(value="{id}", method=RequestMethod.DELETE) public String deleteUser(@PathVariable("id") String userId) { int num = userService.deleteUser(userId); if (1==num){ return ResultUtil.success("操作成功"); } else return ResultUtil.error("操作失敗"); } }

ResultUtil 封裝返回資料格式,這裡只是一個簡單的封裝

public class ResultUtil {

    private final static String SUCCESS = "success";
    private final static String MSG = "msg";
    private final static String DATA = "data";

    public static String success(String msg){
        Map<String,Object> result = new HashMap<String,Object>();
        result.put(SUCCESS, true);
        result.put(MSG, msg);
        result.put(DATA, new Object());
        return JSON.toJSONString(result);
    }

    public static String success(Object data, String msg){
        Map<String,Object> result = new HashMap<String,Object>();
        result.put(SUCCESS, true);
        result.put(MSG, msg);
        result.put(DATA, data);
        return JSON.toJSONString(result);
    }

    public static String error(String msg){
        Map<String,Object> result = new HashMap<String,Object>();
        result.put(SUCCESS, false);
        result.put(MSG, msg);
        result.put(DATA, new Object());
        return JSON.toJSONString(result);
    }

    public static String error(Object data, String msg){
        Map<String,Object> result = new HashMap<String,Object>();
        result.put(SUCCESS, false);
        result.put(MSG, msg);
        result.put(DATA, data);
        return JSON.toJSONString(result);
    }
}

對應的請求url為:

查詢、更新、刪除: /users/1
插入: /users

有時需要管理版本號會把版本號寫在url,比如 v1/users/1v2/users/1 。至於請求是什麼型別的,可以在請求在head中設定,如果是ajax請求則設定比較簡單

$.ajax({
    url: '/users/1',
    type: 'get',//put、delete
    success: function(data) {
        console.log(data)
    }
});

$.ajax({
    url: '/users',
    type: 'post',
    data: {
        userCode: 'test',
        userName: '測試名字'
    },
    success: function(data) {
        console.log(data)
    }
});

RESTful API 的開發涉及許多細節和技術實現,實際開發中的應用會可能會用到一些封裝庫和框架,這裡不做深入瞭解,只是簡單的記錄自己的一些基本認識,相關的知識參考了以下的連結。

相關參考連結