Restful請求風格
- 在RESTful架構中,每個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞,而且所用的名詞往往與數據庫的表格名對應。一般來說,數據庫中的表都是同種記錄的"集合"(collection),所以API中的名詞也應該使用複數。
對於資源的具體操作類型,由HTTP動詞表示。
常用的HTTP動詞有下面五個(括號裏是對應的SQL命令)。
- GET(SELECT):從服務器取出資源(一項或多項)。
- POST(CREATE):在服務器新建一個資源。
- PUT(UPDATE):在服務器更新資源(客戶端提供改變後的完整資源)。
- PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。
- DELETE(DELETE):從服務器刪除資源。
還有兩個不常用的HTTP動詞。
- HEAD:獲取資源的元數據。
- OPTIONS:獲取信息,關於資源的哪些屬性是客戶端可以改變的。
舉例如下:
- GET /zoos:列出所有動物園
- POST /zoos:新建一個動物園
- GET /zoos/ID:獲取某個指定動物園的信息
- PUT /zoos/ID:更新某個指定動物園的信息(提供該動物園的全部信息)
- PATCH /zoos/ID:更新某個指定動物園的信息(提供該動物園的部分信息)
- DELETE /zoos/ID:刪除某個動物園
- GET /zoos/ID/animals:列出某個指定動物園的所有動物
- DELETE /zoos/ID/animals/ID:刪除某個指定動物園的指定動物
狀態碼
- 200 OK - [GET]:服務器成功返回用戶請求的數據,該操作是冪等的(Idempotent)。
- 201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。
- 202 Accepted - [*]:表示一個請求已經進入後臺排隊(異步任務)
- 204 NO CONTENT - [DELETE]:用戶刪除數據成功。
- 400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操作,該操作是冪等的。
- 401 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。
- 403 Forbidden - [*] 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的。
- 404 NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操作,該操作是冪等的。
- 406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是隻有XML格式)。
- 410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
- 422 Unprocesable entity - [POST/PUT/PATCH] 當創建一個對象時,發生一個驗證錯誤。
- 500 INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將無法判斷髮出的請求是否成功。
-
SpringBoot請求方法代碼參考
/** * @author wsyjlly * @create 2019.06.10 - 19:00 * GET(SELECT):從服務器取出資源(一項或多項)。 * POST(CREATE):在服務器新建一個資源。 * PUT(UPDATE):在服務器更新資源(客戶端提供改變後的完整資源)。 * PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。 * DELETE(DELETE):從服務器刪除資源。 **/ @RestController @RequestMapping("/cors") public class RestfulCorsController { @RequestMapping("/") public Map<String,String> itemOperator(@RequestBody ModelMap params){ Map<String,String> map = new HashMap<>(); map.put("name", (String) params.get("name")); System.out.println(params); return map; } @PostMapping("/add") public Map<String,String> addItem(@RequestBody ModelMap params){ Map<String,String> map = new HashMap<>(); map.put("name", (String) params.get("name")); System.out.println(params); return map; } @DeleteMapping("/{id}") public String deleteItem(@PathVariable Long id){ System.out.println(id); return String.valueOf(id); } @PutMapping("/{id}") public String updateItem(@PathVariable Long id){ System.out.println(id); return String.valueOf(id); } @PatchMapping("/patch") public String updateItem(@RequestBody ModelMap entity){ System.out.println(entity); return "STATUS"; } @GetMapping("/{id}") @CrossOrigin(value = "*",allowedHeaders = "*",maxAge = 1800) public String getItem(@RequestParam(value = "id", required = false, defaultValue = "1601141019") @PathVariable Long id){ System.out.println(id); return String.valueOf(id); } }