跳过正文

在Spring应用程序中返回HTTP 4XX错误

Spring HTTP
作者
Harpal Singh
Software Engineer
翻译者
Namastecode
目录

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类及其辅助方法的示例。

相关文章

配置 Spring Boot 应用程序的端口
Spring Basics
配置 Java Web 客户端以进行 HTTPS 请求
WebClient HTTPS Spring
如何使用Restclient重试
Spring-Boot Restclient