REST風格

REST風格簡介

  • REST(Representational State Transfer),表現形式抓狀態轉換
  • 傳統風格資源描述形式
  • http://localhost/user/getById?id=1
  • http://localhost/user/saveUser
  • REST風格描述形式
  • http://localhost/user/1
  • http://localhost/user
  • 優點:
  • 隱藏資源的訪問行為,無法通過地址得知對資源是何種操作
  • 書寫簡化
  • 按照REST風格訪問資源時使用行為動作區分對資源進行何種操作
  • http://localhost/users ----查詢全部用户信息 ---- GET(查詢)
  • http://localhost/users/1 ----查詢指定用户信息---- GET(查詢)
  • http://localhost/users ----添加用户信息 ---- POST(新增/保存)
  • http://localhost/users ----修改用户信息 ---- PUT(修改/更新)
  • http://localhost/users/1 ----刪除用户信息 ----DELETE(刪除)
  • 根據REST風格對資源進行訪問稱為RESTful

注意事項

上述行為是約定形式,約定不是規範,可以打破,所以稱REST風格,而不是REST規範

描述模塊的名稱通常使用複數,也就是加s的格式描述,表示此資源,而非單個資源,例如:users、books、accounts......

入門案例

步驟

  1. 設定http請求動作(動詞)
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
    @ResponseBody
    public String save(@PathVariable int id) {
        System.out.println("user save..." +id);
        return "{'module':'save'}";
    }

    @RequestMapping(value = "/delete",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete() {
        System.out.println("user delete...");
        return "{'module':'user delete'}";
    }
    @RequestMapping(value = "/users",method = RequestMethod.POST)
    @ResponseBody
    public String list(@RequestBody User user) {
        System.out.println("user delete..."+ user);
        return "{'module':'"+user+"'}";
    }
}
  1. 設定請求參數(路徑變量)
@RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
@ResponseBody
public String save(@PathVariable int id) {
    System.out.println("user save..." +id);
    return "{'module':'save'}";
}

@RequestBody @RequestParam @PathVariable

  • 區別
  • @RequestBody用於接收url地址傳參或表單傳參
  • @RequestParam用於接收json數據
  • @PathVariable用於接收路徑參數,使用{參數名稱}描述路徑參數
  • 應用
  • 後期開發中,發送請求參數超過一個時,以json格式為主,@RequestBody應用較廣
  • 如果發送非json格式數據,選用@RequestParam接收請求參數
  • 採用RESTful進行開發,當參數數量較少時,例如一個,可以採用@PathVariable接收請求路徑變量,通常用於傳遞id值

案例:基於RESTful頁面數據交互

  1. 製作SpringMVC控制器,並通過PostMan測試接口功能
@RestController
@RequestMapping("/books")
public class BookController {
    @PostMapping
    public String save(@RequestBody Book book){
        System.out.println("book save==>" + book);
        return "{'module':'book save success'}";
    }
    @GetMapping
    public List<Book> getAll(){
        System.out.println("book getAll is running ...");
        List<Book> bookList=new ArrayList<>();
        Book book = new Book();
        book.setType("計算機");
        book.setName("SpringMVC入門教程");
        book.setDescription("小試牛刀");
        Book book1 = new Book();
        book1.setType("計算機");
        book1.setName("SpringMVC實戰教程");
        book1.setDescription("一代宗師");
        bookList.add(book);
        bookList.add(book1);
        return bookList;
    }
}
  1. 設置對靜態資源的訪問放行
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    //設置靜態資源訪問過濾,當前類需要設置為配置類,並被掃描加載
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //當訪問/pages/????時候,從/pages目錄下查找內容
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}
  1. 前端頁面通過異步提交訪問後台控制器
// 彈出添加窗口
openSave() {
    this.dialogFormVisible = true;
    this.resetForm();
},

//添加
saveBook () {
    axios.post("/books",this.formData).then((res)=>{

    });
},

//主頁列表查詢
getAll() {
    axios.get("/books").then((res)=>{
        this.dataList = res.data;
    });