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