SpringMVC(三)【REST 风格】

简介: SpringMVC(三)【REST 风格】

1、REST 风格

1.1、REST 简介

  • REST(Representational State Transfer),表现形式状态转换

       在开发中,它其实指的就是访问网络资源的格式

1.1.1、传统风格资源描述形式

  • http://localhost/user/getById?id=1
  • http://localhost/user/saveUser

1.1.2、REST 风格描述形式

在 REST 风格中,一般用 模块名 + s 的格式描述资源,表示这是一类资源,而不是单个资源。

4 个常用的 REST 风格请求行为

  • http://localhost/users        查询所有用户信息        GET (查询)
  • http://localhost/users/1        查询指定用户信息        GET (查询)
  • http://localhost/users        添加用户信息        POST (新增)
  • http://localhost/users        修改用户信息        PUT (更新)
  • http://localhost/users/1        删除用户信息        DELETE (删除)

       REST 风格下,对于同一个路径,不同的请求代表对资源不同的操作。也就是说,我们只需要一个路径和一个请求方式就可以确定一个访问行为

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

优点

  1. 最大在优点就是隐藏资源的访问行为,无法通过地址得到对资源是如何操作的

注意:REST 风格只是一种风格,并不是一种规范,可以打破。也就是说我们想怎么写就怎么写,但是我们只是希望大家都遵守这种风格,方便开发。

1.2、RESTful 入门案例

       RESTful 就是指使用 REST 风格开发项目。

1.2.1、设定 http 请求动作

       REST 风格下,我们对资源的不同操作由路径请求动作决定,这里的路径我们统一为 模块名 + s,所以我们需要把 Controller 类上面的 @RequsetMapping 中指定的该模块资源的统一前缀去掉。

       添加请求动作只需要先把原本 Controller 类的方法上 RequsetMapping 注解的参数改为 模块名 + s  ,然后通过 method 属性来给方法添加请求动作。

       查询都是 GET、新增是 POST 、修改是 PUT、删除是 DELETE

    @RequestMapping(value = "/users",method = RequestMethod.POST)
    @ResponseBody
    public String save(@RequestBody User user){
        System.out.println("user save,  name = " + user.getName() + " , age = " + user.getAge());
        return "{'module':'user save'}";
    }

        这里的新增用户请求需要传递用户参数,这里我们通过 @RequestBody 注解来表示从请求体中获取参数,也就是通过 json 来传递

1.2.2、设定请求路径参数

       也就是我们控制器类方法上面的注解 @RequsetMapping 中的 value 参数,这里需要根据需求决定需不需要带参数(比如删除 name 为 'zs' 的用户,那就需要指定 value="/users/name" 而不只是模块名+s)。

       此外,对于带有路径变量的请求参数需要给形参前面添加注解 @PathVariable ,表示从请求路径中解析出该变量当做形参的值。

    @RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id){
        System.out.println("user deleted ... user id => " + id);
        return "{'module': 'user delete'}";
    }

完整代码:

@Controller
public class UserController {
 
    @RequestMapping(value = "/users",method = RequestMethod.POST)
    @ResponseBody
    public String save(@RequestBody User user){
        System.out.println("user save,  name = " + user.getName() + " , age = " + user.getAge());
        return "{'module':'user save'}";
    }
 
    @RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id){
        System.out.println("user deleted ... user id => " + id);
        return "{'module': 'user delete'}";
    }
 
    @RequestMapping(value = "/users",method = RequestMethod.PUT)
    @ResponseBody
    public String update(@RequestBody User user){
        System.out.println("user deleted ... user => " + user.toString());
        return "{'module': 'user update'}";
    }
 
    @RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
    @ResponseBody
    public String getById(@PathVariable Integer id){
        System.out.println("user get ... user id => " + id);
        return "{'module': 'user get'}";
    }
 
    @RequestMapping(value = "/users",method = RequestMethod.GET)
    @ResponseBody
    public String getAll(){
        System.out.println("user get all ...");
        return "{'module': 'user get all'}";
    }
}

测试结果:

查询所有用户:

查询 id 为 1 的用户:

新增用户:

注意新增用户时我们需要给控制器方法传递一个 User 类型创参数,因为需要使用 jackson 把我们的 json 转为 java 对象,这里要求该对象必须要有无参构造器,不然会报错!

删除用户:

修改用户:

1.2.3、请求参数总结

到现在我们共学习了三种请求参数的传递方法:

  1. @RequestBody
  2. @RequestParam(用的比较少)
  3. @PathVariable

1.3、RESTful 快速开发

       这一节我们来对上面的代码进行简化开发,比如所有的控制器方法的前缀都是 "/users" ,所有的控制器方法上面都有一个 @ResponseBody (因为我们不需要返回页面)。

1.3.1、统一路径前缀

       上一节使用 REST 风格后,我们发现所有的请求路径的前缀都是 "/users" + 路径变量,所以既然都有一个前缀 "/users" ,那么为什么不可以都踢出来呢:

@RequestMapping("/users")
public class UserController {
    // ...
}

       这样,对于那些在 REST 风格下路径本来就是 模块名+s("/users")的方法,直接就可以直接省去 @RequestMapping 中的 value 属性,对于请求路径包含路径变量的方法,可以省去前缀,就像这样:

    @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
    public String delete(@PathVariable Integer id){
        System.out.println("user deleted ... user id => " + id);
        return "{'module': 'user delete'}";
    }

1.3.2、@RestController

       从上一节我们的代码中可以发现,控制器类的方法都带有一个 @ResponseBody ,这是因为因为我们不需要返回页面。所以这里我们可以直接简化把它提到控制器类上面:

@Controller
@ResponseBody
@RequestMapping("/users")
public class UserController {
    // ...
}

       但是 SpringMVC 还是觉得不够简化,它又提供了一个注解 @RestController ,它就相当于同时包含了 @ResponseBody 和 @Controller 两个注解,毕竟控制器类上面肯定是由 @Controller 注解的。所以以后我们直接这么写就行了:

@RestController
@RequestMapping("/users")
public class UserController {
    // ...
}

SpringMVC(三)【REST 风格】(2)https://developer.aliyun.com/article/1534213



相关文章
|
6月前
|
JSON 网络架构 数据格式
SpringMVC-REST风格简介及RESTful入门案例
SpringMVC-REST风格简介及RESTful入门案例
73 0
|
5月前
|
JSON 前端开发 Java
spring mvc Rest风格
spring mvc Rest风格
40 0
|
6月前
|
JSON 网络架构 数据格式
SpringMVC -- REST风格开发,RESTful快速开发、RESTful注解开发
SpringMVC -- REST风格开发,RESTful快速开发、RESTful注解开发
77 2
|
5月前
|
应用服务中间件 网络架构 容器
SpringMVC(三)【REST 风格】(2)
SpringMVC(三)【REST 风格】
|
11月前
|
XML JSON Java
SpringMVC与REST相结合实现RESTful风格
SpringMVC与REST相结合实现RESTful风格
124 0
|
SQL 前端开发 Java
【SpringMVC】RESTful风格CRUD实现
【SpringMVC】RESTful风格CRUD实现
56 0
|
缓存 测试技术
SpringMVC的Restful风格
SpringMVC的Restful风格
49 0
SpringMVC RestFul风格实现
在controller层中定义如下的代码,代码会获取路径上的值并返回a和b的加和: RestFul风格的路径需要使用@PathVariable注解表示变量:
161 0
SpringMVC RestFul风格实现
|
JSON 网络架构 数据格式
SpringMVC的请求与相应和REST风格
SpringMVC的请求与相应和REST风格
95 0
SpringMVC的请求与相应和REST风格