1. 介绍
在这个快速教程中,我们将学习如何在 Spring 应用程序中返回 HTTP 4XX 错误。
2. Restful API中的良好HTTP状态码
在设计RESTful API时,我们必须始终设计我们的API以返回有意义的HTTP响应给客户端,以便请求的结果是明确的。对于理想路径场景,直接的方法是返回预期的响应。在这种情况下,Spring会默认将头部设置为HTTP 200。然而,当请求失败时,我们需要返回一个适当的HTTP状态码给客户端。例如,当客户端发送带有无效数据的请求时,我们应该返回一个HTTP 4XX请求状态码。
Spring 提供了多种方法来返回适当的响应。在这里,我们将探讨 ResponseEntity
类。
3. 错误处理 HTTP 错误的示例
让我们考虑一个简单的例子,其中我们有一个控制器方法,它返回学生的名字作为一个字符串:
@GetMapping(value = "/student/{id}/name")
@ResponseBody
public String getStudentNameById(@PathVariable String id) {
Optional<Student> student = studentService.findById(matchId);
if(student.isPresent()){
return student.get().getName();
}
// --- What to do here?
}
在上面的例子中,如果我们找到学生,我们将返回其姓名;否则,我们需要处理未找到的情况。例如,我们可能会返回一个错误字符串:
@GetMapping(value = "/student/{id}/name")
@ResponseBody
public String getStudentNameById(@PathVariable String id) {
Optional<Student> student = studentService.findById(matchId);
if(student.isPresent()){
return student.get().getName();
}
return "Student not found";
}
在这种情况下,控制器方法返回了一个HTTP 200状态码,这可能会破坏客户端的信任,因为响应不是他们所期望的。 相反,我们应该返回一个HTTP 404 Not Found状态码。
4. 使用 ResponseEntity
为了解决这个问题,我们可以使用 ResponseEntity
类。通过将控制器方法的返回类型包装为 ResponseEntity<?>
,我们可以同时设置 HTTP 状态码和响应体。
现在,我们不能直接返回一个字符串。相反,我们需要返回一个 ResponseEntity
实例:
@GetMapping(value = "/student/{id}/name")
public ResponseEntity<?> getStudentNameById(@PathVariable String id) {
Optional<Student> student = studentService.findById(matchId);
if(student.isPresent()){
return ResponseEntity.ok(student.get().getName());
}
return ResponseEntity.notFound().build();
}
在上面的代码中,我们使用 ResponseEntity.ok()
方法来返回找到的学生姓名。如果没有找到学生,我们使用 ResponseEntity.notFound()
方法返回 HTTP 404 Not Found 状态码。
从 Spring 4.1 开始,ResponseEntity
类提供了几个辅助方法,用于创建具有不同 HTTP 状态码的 ResponseEntity
实例。这使得代码更加易读且富有表现力。
例如,要返回一个 HTTP 400 Bad Request 状态码,我们可以使用 ResponseEntity.badRequest()
方法,或者决定手动构建响应:
return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
5. 使用 ResponseEntity
的好处
将ResponseEntity<?>
用作控制器方法的返回类型具有以下几个优点:
- 灵活性 它允许更灵活地定义HTTP状态码和响应主体。
- 可读性 代码更具可读性和表达性,特别是在使用辅助方法时。
- 一致性 它鼓励在整个应用程序中采用一致的方法来处理HTTP响应。
6. 结论
在这篇短文中,我们学习了如何在Spring应用程序中使用ResponseEntity
类处理HTTP 4XX错误。首先,我们解释了手头的问题。接着,我们展示了在RESTful API中返回正确HTTP状态码的重要性。最后,我们演示了如何使用ResponseEntity
类及其辅助方法的示例。