MVC
的RESTful
風格的實現RESTful
風格闡述REST
服務是一種ROA
(Resource-Oriented Architecture,面向資源的架構)應用。主要特色是方法信息存在於HTTP
協議的方法中(GET
,POST
,PUT
,DELETE
),做用域存在於URL
中。例如,在一個獲取設備資源列表的GET
請求中,方法信息是GET
,做用域信息是URI種包含的對設備資源的過濾、分頁和排序等條件==良好的
REST API
不須要任何文檔==java
REST
風格資源路徑REST
風格的資源路徑設計是面向資源的,==資源的名稱==應該是準確描述該資源的==名詞==。web
資源路徑概覽:sheme://host:port/path?queryString
例:http://localhost:8080/bywlstudio/users/user?username=xiuerspring
HTTP
方法GET
用於==讀取==、==檢索==、==查詢==、==過濾==資源
PSOT
用於==建立==一個資源apache
PUT
用於==修改==、==更新==資源、==建立客戶端維護主鍵信息的資源==json
DELETE
用於==刪除==資源tomcat
資源地址和HTTP
方法結合在一塊兒就能夠實現對資源的完整定位服務器
RESTful
風格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
MVC
對REST
的支持@Controller
聲名一個處理請求的控制器@RequestMapping
請求映射地址,它存在幾個子註解對於實現REST
風格來講更加具備==語義性==
@GETMapping
==GET請求==@PUTMapping
==PUT請求==@POSTMapping
==POST請求==@DELETEMapping
==DELETE請求==@ResponseBody
將響應內容轉換爲JSON
格式@RequestBody
請求內容轉換爲JSON
格式@PathVariable("id")
用於綁定一個參數@RESTController
等同於@Controller
+@ResponseBody
在類上寫了這個註解,標識這個類的全部方法只==返回數據==,而不進行==視圖跳轉==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); }
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>
MVC
實現REST
代碼實現JDK1.8
maven3.60
tomcat9
API
設計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 |
@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