SpringMVC——REST

74 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

REST简介

==REST==(Representational State Transfer),表现形式状态转换,它是一种软件架构==风格==

传统方式一般是一个请求url对应一种操作,这样做不仅麻烦,也不安全,因为会程序的人读取了你的请求url地址,就大概知道该url实现的是一个什么样的操作。 REST的优点有:

  • 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
  • 书写简化

按照REST风格访问资源时使用==行为动作==区分对资源进行了何种操作

-   `http://localhost/users` 查询全部用户信息 GET(查询)
-   `http://localhost/users/1` 查询指定用户信息 GET(查询)
-   `http://localhost/users` 添加用户信息 POST(新增/保存)
-   `http://localhost/users` 修改用户信息 PUT(修改/更新)
-   `http://localhost/users/1` 删除用户信息 DELETE(删除)

请求的方式比较多,但是比较常用的就4种,分别是GET,POST,PUT,DELETE

按照不同的请求方式代表不同的操作类型。

  • 发送GET请求是用来做查询
  • 发送POST请求是用来做新增
  • 发送PUT请求是用来做修改
  • 发送DELETE请求是用来做删除

但是==注意==:

  • 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范

    • REST提供了对应的架构方式,按照这种架构设计项目可以降低开发的复杂性,提高系统的可伸缩性
    • REST中规定GET/POST/PUT/DELETE针对的是查询/新增/修改/删除,但是我们如果非要用GET请求做删除,这点在程序上运行是可以实现的
    • 但是如果绝大多数人都遵循这种风格,你写的代码让别人读起来就有点莫名其妙了。
  • 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts......

清楚了什么是REST风格后,我们后期会经常提到一个概念叫RESTful,那什么又是RESTful呢?

  • 根据REST风格对资源进行访问称为==RESTful==。

RESTful快速开发

问题1:每个方法的@RequestMapping注解中都定义了访问路径/books,重复性太高。

@RequestMapping提到类上面,用来定义所有方法共同的访问路径。

问题2:每个方法的@RequestMapping注解中都要使用method属性定义请求方式,重复性太高。

使用@GetMapping  @PostMapping  @PutMapping  @DeleteMapping代替

问题3:每个方法响应json都需要加上@ResponseBody注解,重复性太高。

1.将ResponseBody提到类上面,让所有的方法都有@ResponseBody的功能
2.使用@RestController注解替换@Controller@ResponseBody注解,简化书写

知识点1:@RestController

名称@RestController
类型==类注解==
位置基于SpringMVC的RESTful开发控制器类定义上方
作用设置当前控制器类为RESTful风格, 等同于@Controller与@ResponseBody两个注解组合功能

知识点2:@GetMapping @PostMapping @PutMapping @DeleteMapping

名称@GetMapping @PostMapping @PutMapping @DeleteMapping
类型==方法注解==
位置基于SpringMVC的RESTful开发控制器方法定义上方
作用设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作, 例如@GetMapping对应GET请求
相关属性value(默认):请求访问路径

RESTful案例

需求分析

需求一:图片列表查询,从后台返回数据,将数据展示在页面上

image.png 需求二:新增图片,将新增图书的数据传递到后台,并在控制台打印

image.png 步骤分析:

1.搭建项目导入jar包

2.编写Controller类,提供两个方法,一个用来做列表查询,一个用来做新增

3.在方法上使用RESTful进行路径设置

4.完成请求、参数的接收和结果的响应

5.使用PostMan进行测试

6.将前端页面拷贝到项目中

7.页面发送ajax请求

8.完成页面数据的展示

后台接口开发

步骤1:编写Controller类并使用RESTful进行配置
@RestController
@RequestMapping("/books")
public class bookCntroller {
    @PostMapping
    public String save(@RequestBody Book book){
        System.out.println("book=>"+book);
        return "{'module':'save success'}";
    }
    @GetMapping
    public List<Book> getAll(){
        Book book1 = new Book();


        book1.setName("AAA");
        book1.setType("武侠");
        book1.setDescription("武侠小说");
        Book book2 = new Book();


        book2.setName("BBB");
        book2.setType("言情");
        book2.setDescription("言情小说");
        List<Book> bookList = new ArrayList<Book>();
        bookList.add(book1);
        bookList.add(book2);
        return bookList;

    }
}
步骤2:使用PostMan进行测试

image.png

页面访问处理

SpringMVC需要将静态资源进行放行。(一次性工作)

@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/");
    }
}
步骤3:修改books.html页面
  //添加
                saveBook () {
                    axios.post("/books",this.formData).then((res)=>{

                    });
                },

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