如何为REST API端点选择正确的HTTP响应代码: Spring Boot

nbewdwxp  于 2023-03-16  发布在  Spring
关注(0)|答案(1)|浏览(123)

我正在开发Sping Boot 应用程序,以便为移动的应用程序开发REST API。
终点的示例包括:
1.当创建实体时-

@PostMapping("/new-user")
    public ResponseEntity<SuccessResponse<UserDto>> createUser(
            @Valid /* Enable validation */ @RequestBody UserDto userDto) {
        UserDto createdUserDto = this.userService.createUser(userDto);
        SuccessResponse<UserDto> successResponse = new SuccessResponse<>(AppConstants.SUCCESS_CODE,
                AppConstants.SUCCESS_MESSAGE, createdUserDto);
        return new ResponseEntity<>(successResponse, HttpStatus.OK);
    }

在这种情况下的React是-

{
    "data": {
        "userId": 2,
        "token": "eyJhbGciOiJIUzI1NiJ9.eyJzd3-WIiOiJheXVzaDIwYXBydwaWxAZ21haWwuY29tIiwiZXhwIjoxNjc4NzEyNjIyLCJpYXQiOjE2Nzg3MTI1NjJ9.xLNdJ4L4JjmnN3pkkp3gm3RrzLU6lBG2-mGLHn4f_Pg"
    },
    "status": "Success",
    "code": "2000"
}

1.当异常发生时-

@ExceptionHandler(DuplicateResourceException.class) // add comma separated list of Exception classes
    public ResponseEntity<ApiResponse> duplicateResourceFoundException(DuplicateResourceException ex) {
        ApiResponse apiResponse = new ApiResponse(ex.getMessage(), AppConstants.ERROR_CODE, AppConstants.ERROR_MESSAGE);
        return new ResponseEntity<ApiResponse>(apiResponse, HttpStatus.OK);
    }

在这种情况下的React是-

{
    "message": "2002",
    "code": "Token is expired",
    "status": "Error"
}

我的问题是

上面的API按预期工作,在两种情况下都给出带有状态代码200的响应。我添加了一个自定义状态代码作为API响应的一部分。
现在,我的问题是,提供自定义状态代码并在客户端检查它是否正确(如2000表示成功,2001表示失败,2002表示错误),或者我应该使用Http状态,如200表示成功,201表示已创建,404表示未在ResponseEntity中找到
我想确保我遵循了正确的惯例。

guykilcj

guykilcj1#

现在,我的问题是,提供自定义状态代码并在客户端检查它是否正确(如2000表示成功,2001表示失败,2002表示错误),或者我应该使用Http状态,如200表示成功,201表示已创建,404表示未在ResponseEntity中找到?
HTTP状态码是transfer-of-documents-over-a-network域的元数据,用于向通用HTTP组件(浏览器、代理等)传递响应消息的语义。
您几乎从来不希望在HTTP响应行中使用定制的状态代码-因为通用组件不知道它们的含义,因此会以某种通用方式解释它们(因此使用标准化代码不会获得太多优势)。
在响应体中使用定制的代码、消息、标识符是很好的。HTTP应用程序协议实际上并不太关心你在网络上传递的文档的语义。

相关问题