基於MVC的RESTful風格的實現
基於MVC
的RESTful
風格的實現
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.MVC
對REST
的支援
1.1主要通過註解來實現
-
@Controller
聲名一個處理請求的控制器 -
@RequestMapping
請求對映地址,它存在幾個子註解對於實現REST
風格來說更加具有語義性-
@GETMapping
-
@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
預設不支援PUT
和DELETE
方法,所以需要手動開啟
在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