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" }