Spring Boot进阶:原理、实战与面试题分析
上QQ阅读APP看书,第一时间看更新

4.1.1 创建Web服务

在Spring Boot中,创建Web服务的主要工作是实现Controller。而在创建Controller之后,需要对HTTP请求进行处理并返回正确的响应结果。我们可以基于一系列注解来开展这些开发工作。

1. 创建Controller

创建Controller的过程比较固定,我们已经在第1章中实现过一个简单的Controller,如代码清单4-1所示。

代码清单4-1 UserController示例代码

@RestController
@RequestMapping(value="users")
public class UserController {
    @GetMapping(value = "/{id}")
    public User getUserById(@PathVariable Long id) {
        User user = new User();
        ...
        return user;
    }
}

这是一个典型的Controller,可以看到上述代码包含了@RestController、@Request-Mapping和@GetMapping等注解。其中,@RestController注解继承自Spring WebMVC中的@Controller注解,顾名思义就是一个RESTful风格的HTTP端点,并且会自动使用JSON实现HTTP请求和响应的序列化/反序列化。根据这一特性,我们在构建Web服务时可以使用@RestController注解来取代@Controller注解以简化开发。

@GetMapping注解和@RequestMapping注解的功能类似,只是默认使用Request-Method.GET来指定HTTP方法。Spring Boot 2引入了一批新注解,除了@GetMapping外还有@PutMapping、@PostMapping、@DeleteMapping等,方便开发人员显式指定HTTP请求方法。当然,我们也可以继续使用原先的@RequestMapping注解来实现同样的效果。

在上述UserController中,我们通过静态代码完成根据用户ID获取用户信息的业务流程。这里用到了两层Mapping,第一层的@RequestMapping注解在服务层级定义了服务的根路径users,而第二层的@GetMapping注解则在操作级别又定义了HTTP请求方法的具体路径及参数信息。

2. 处理Web请求

处理Web请求的过程涉及获取输入参数以及返回响应结果。Spring Boot提供了一系列便捷有用的注解来简化对请求输入的控制过程,常用的包括上述UserController中所展示的@PathVariable和@RequestBody。

@PathVariable注解用于获取路径参数,即从类似url/{id}这种形式的路径中获取{id}参数的值。通常,使用@PathVariable注解时只需要指定参数的名称即可。代码清单4-2是使用@PathVariable注解的典型代码示例,这里在请求路径中同时传入了两个参数。

代码清单4-2 @PathVariable注解使用的示例代码

@PostMapping(value = "/{username}/{password}")
public User generateUser(@PathVariable("username") String username, @PathVariable("password") String password) {
    User user = userService.generateUser(username, password);
    return user;
}

在HTTP中,content-type属性用来指定所传输的内容类型。而我们可以通过@Request-Mapping注解中的produces属性来对其进行设置,通常会将其设置为application/json,示例代码如代码清单4-3所示。

代码清单4-3 content-type属性使用的示例代码

@RestController
@RequestMapping(value = "users", produces="application/json")
public class UserController {
}

而@RequestBody注解就是用来处理content-type为application/json类型时的请求内容。通过@RequestBody注解可以将请求体中的JSON字符串绑定到相应的实体对象上。我们可以对前面的generateUser()方法进行重构,通过@RequestBody注解来传入参数,如代码清单4-4所示。

代码清单4-4 @RequestBody注解使用的示例代码

@PostMapping(value = "/")
public User generateUser(@RequestBody User user) {
}

这时候,如果想要通过Postman来发起这个POST请求,就需要使用如代码清单4-5所示的一段JSON字符串。

代码清单4-5 请求JSON字符串示例

{
    "username": "tianyalan",
    "password":"123456"
}