Spring Boot Sping Boot REST API:是否返回ResponseEntity的状态代码?

b4qexyjb  于 2023-03-02  发布在  Spring
关注(0)|答案(3)|浏览(277)

我在我的Sping Boot REST API控制器中使用了以下方法,在这里,我通常返回ResponseEntity.ok(),因为我还想将返回的数据传递给客户机。
但是我希望根据操作返回正确的状态,比如创建记录后,应该使用ResponseEntity.created()等等,我试过使用,但是它只是以URI location为参数,以下几点我不确定:

**1)**如何在Sping Boot 应用中使用ResponseEntity正确返回创建、编辑和删除请求?
**2)**我不确定如何使用ResponseEntity.created()将创建的记录的id或创建的记录的一些数据返回给客户端。

  1. @PostMapping("/categories")
  2. public ResponseEntity<ApiResponse<CommandResponse>> create(
  3. @Valid @RequestBody CategoryRequest request) {
  4. CommandResponse response = categoryService.create(request);
  5. return ResponseEntity.ok(
  6. new ApiResponse<>(Instant.now(clock).toEpochMilli(), SUCCESS, response));
  7. }

我还使用了一个定制的ApiResponse类来 Package 包含必要信息的响应。
注意:我还使用@RestControllerAdvice实现了一个全局异常处理器。除了GET之外,我只想使用和返回正确的POST、PUT和DELETE请求类型。

mwyxok5s

mwyxok5s1#

ResponseEntity.created()返回一个builder对象,允许您根据需要修改响应(看下面的例子)默认情况下,这个URI参数应该指向API方法,它允许你读取那个方法(包括id)。这些方法将设置自动创建的响应代码(201),ok(200),但是如果您确实需要修改它,您可以使用@ResponseStatus(HttpStatus.XXX)注解该方法。

  1. ResponseEntity.created(uriToTheCreatedObject)
  2. .body(id)

如果删除,则只返回ResponseEntity.ok()

cczfrluj

cczfrluj2#

您可以使用静态方法status来个性化您的http状态。例如:

  1. ResponseEntity.status(HttpStatus.ACCEPTED).build();

具有主体:

  1. ResponseEntity.status(HttpStatus.OK).body("a message");
  2. ResponseEntity.status(HttpStatus.CREATED).body("a message");

作为HTTP代码的经验法则,我使用标准的REST操作(POST,PUT,GET,DELETE)

  • 开机自检=〉HttpCode 201(已创建)
  • 放置、获取=〉HttpCode 200(正常)
  • 删除=〉HTTP代码204(无内容)
x33g5p2x

x33g5p2x3#

每个API端点应该在成功响应中返回一个HttpStatus。通常,它将是2xx状态代码。对于您的情况,您可以返回HttpStatus.ok,如下所示

  1. @PostMapping("/categories")
  2. @ResponseStatus(HttpStatus.OK)
  3. public ApiResponse<CommandResponse> create(@Valid @RequestBody CategoryRequest request) {
  4. CommandResponse response = categoryService.create(request);
  5. return new ApiResponse<>(Instant.now(clock).toEpochMilli(), SUCCESS, response);
  6. }

在失败响应的情况下,您已经有了@RestControllerAdvice,每个异常都将被处理并返回相应的HttpStatus代码,最好有一个通用的异常处理程序,以避免像这样中断请求上下文线程

  1. @ResponseBody
  2. @ExceptionHandler(Throwable.class)
  3. @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
  4. public void handleException(Throwable ex) {
  5. log.error("Internal Server Error", ex);
  6. }

相关问题