- 使用 @RestController 和 @RequestMapping
@RestController 注解表明该类中的所有方法都会返回结果直接写入HTTP响应体中,而不是使用视图解析器。@RequestMapping 注解用于将HTTP请求映射到控制器的处理方法上。
@RestController
public class MyController {
@RequestMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
- 支持不同的HTTP方法
Spring Boot 提供了 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping 和 @PatchMapping 注解来处理不同的HTTP请求方法。
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
}
@PostMapping("/users")
public User createUser(@RequestBody User user) {
}
- 请求参数和路径变量
使用 @RequestParam 来获取查询参数,使用 @PathVariable 来获取路径中的数据。
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id, @RequestParam(required = false) String name) {
}
- 返回值
返回一个对象,Spring Boot 会自动将其转换为JSON(默认使用Jackson库)
@GetMapping("/users")
public List<User> getAllUsers() {
}
- 异常处理
使用 @ExceptionHandler 或 @ControllerAdvice 来全局处理异常
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
- 使用 RestTemplate 调用外部RESTful服务
Spring Boot 提供了 RestTemplate 来调用外部RESTful服务。
@Service
public class MyService {
private final RestTemplate restTemplate;
public MyService(RestTemplateBuilder restTemplateBuilder) {
this.restTemplate = restTemplateBuilder.build();
}
public Details someRestCall(String name) {
return this.restTemplate.getForObject("/{name}/details", Details.class, name);
}
}
- 版本控制
在设计RESTful API时,应该考虑版本控制。通常,版本号被包含在URL路径中。
@GetMapping("/api/v1/users/{id}")
public User getUserByIdV1(@PathVariable Long id) {
}
- 测试
使用Spring Boot的测试工具来测试RESTful服务。
@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
public class MyControllerTest {
@Autowired
private.MockMvc mockMvc;
@Test
public void testHello() throws Exception {
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World!"));
}
}