spring中的RESTFUL風格是什麼?
什麼是RestFul風格:
RestFul是一種軟體架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和伺服器互動類的一種程式碼編寫風格。基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取等機制。
來源:
REST 來自於Roy Thomas Fielding 2000年的博士論文 - 《Architectural Styles and the Design of Network-based Software Architectures》
實現機制:
restful風格實現的機制有多種,常見的有RPC和基於web的服務
請求方式:
在Restful風格中,使用者發起請求的傳送方式有:get,post,delete,put…等方式對請求的處理方法進行區分,這樣可以在前後臺分離式的開發中使得前端開發人員不會對請求的資源地址產生混淆和大量的檢查方法名的麻煩,形成一個統一的介面。
在Restful風格中,現有規定如下:
GET(SELECT):從伺服器查詢,可以在伺服器通過請求的引數區分查詢的方式。
POST(CREATE):在伺服器新建一個資源,呼叫insert操作。
PUT(UPDATE):在伺服器更新資源,呼叫update操作。
PATCH(UPDATE):在伺服器更新資源(客戶端提供改變的屬性)。(目前jdk7未實現,tomcat7也不行)。
restful和非restful的區別:
他會對url進行規範:
a) 非REST風格的url:localhost:8080/springmvc?name=小白&password=123;
b) REST風格的url:localhost:8080/springmvc/小白/123;
分析:
直觀上看是不是比較簡潔
看不懂:隱藏了引數名稱,安全,防止被攻擊
所有的url都可以當成是資源
對http的方法進行規範
a)不管是刪除,新增,更新….使用的url都是一致,那麼如果需要刪除,就把http的方法設定刪除delete
b) 控制器:通過判斷http的方法來執行操作(增刪改查)
目前這種做法還沒有被廣泛採用
程式碼實現:
* 1.路徑的變化:/hello_rest/{name}/{password}其中{}相當於可以新增的動態的引數,
* 也可以將工程名寫在後面:/{name}/{password}/hello_rest
* 2.引數的寫法:需要利用@PathVariable("name")來匹配上面的引數,這樣才可以取到值
* 3.至於@PathVariable後面跟的形參你就可以隨便命名了
* @param username
* @param password
* @return
*/
@RequestMapping(value = "/hello_rest/{name}/{password}")
//@RequestMapping(value = "/{name}/{password}/hello_rest")
public String hello_rest(@PathVariable("name") String username,
@PathVariable("password") String password) {
if("admin".equals(username)&"123".equals(password)){
System.out.println("登入成功");
return "hello";
}
return "hello";
}
訪問路徑:localhost:8080/工程名/hello_rest/xx/xx(其中xx就是你隨便填寫的內容,它會匹配到後臺的name和password的值)
比如:
你輸入的路徑是:localhost:8080/工程名/hello_rest/小白/admin
後臺會匹配到:name=“小白”,password=“admin”
SpringBoot 中使用 RESTful
使用到的註解:
@Controller:修飾class,用來建立處理http請求的物件
@RestController:Spring4之後加入的註解,原來在@Controller中返回json需要@ResponseBody來配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,預設返回json格式。
@RequestMapping:配置url對映,在Spring 4.3 之後,為了更好的支援 RESTful 風格,增加了幾個註解:@PutMapping、@GetMapping、@DeleteMapping、@PostMapping,其實也就是將 method 屬性的值與 @RequestMapping 進行了繫結而已。
下面我們嘗試使用Spring MVC來實現一組對User物件操作的RESTful API,配合註釋詳細說明在Spring MVC中如何對映HTTP請求、如何傳參。
public class User {
private Long id;
private String name;
private Integer age;
// 省略setter和getter
}
@RestController
@RequestMapping(value="/users") // 通過這裡配置使下面的對映都在/users下
public class UserController {
// 建立執行緒安全的Map
static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());
// @RequestMapping(value="/", method=RequestMethod.GET)
@GetMapping("/")
public List<User> getUserList() {
// 處理"/users/"的GET請求,用來獲取使用者列表
// 還可以通過@RequestParam從頁面中傳遞引數來進行查詢條件或者翻頁資訊的傳遞
List<User> r = new ArrayList<User>(users.values());
return r;
}
//@RequestMapping(value="/", method=RequestMethod.POST)
@PostMapping("/")
public String postUser(@ModelAttribute User user) {
// 處理"/users/"的POST請求,用來建立User
// 除了@ModelAttribute繫結引數之外,還可以通過@RequestParam從頁面中傳遞引數
users.put(user.getId(), user);
return "success";
}
//@RequestMapping(value="/{id}", method=RequestMethod.GET)
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
// 處理"/users/{id}"的GET請求,用來獲取url中id值的User資訊
// url中的id可通過@PathVariable繫結到函式的引數中
return users.get(id);
}
//@RequestMapping(value="/{id}", method=RequestMethod.PUT)
@PutMapping("/{id}")
public String putUser(@PathVariable Long id, @ModelAttribute User user) {
// 處理"/users/{id}"的PUT請求,用來更新User資訊
User u = users.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
users.put(id, u);
return "success";
}
//@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable Long id) {
// 處理"/users/{id}"的DELETE請求,用來刪除User
users.remove(id);
return "success";
}
}
總結
我們通過建立User實體類,再來實現對實體類物件的操作介面,使用@PutMapping、@GetMapping、@DeleteMapping、@PostMapping這四個註解來完成對@RequestMapping 和method屬性值的繫結(這是Spring 4.3 之後,為了更好的支援 RESTful 風格,增加了幾個註解),並且通過 @PathVariable 註解來將 HTTP 請求中的屬性繫結到我們指定的形參上。
這樣,在開發的過程中我們就可以使用統一的介面地址,傳遞不同的引數配合不同的請求方式即可實現不同的方法呼叫,實現不同的功能,怎麼樣?是不是更簡潔,更安全了。