使用 POST 注册用户 - 如何正确使用响应实体



我正在构建REST API(不是公共的,只是为了我自己网站的后端(,我有一个用于注册新用户的控制器:

  // CREATE A USER
@PostMapping("/register")
public ResponseEntity<?> createUser(
        @RequestBody User user
) {
    if (userService.userExists(user)) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("User with that username already exists.");
    }
    return ResponseEntity.ok(userService.saveUser(user));
}

当用户名已被占用时,我不喜欢我的响应实体中的字符串 - 处理这些事情的正确方法是什么?我知道我应该从我所有的控制器返回 JSON,但我不知道如何在该方法中实现它。

此外,在此控制器中仅以 JSON 返回用户名罚款:

// DELETE YOUR ACCOUNT - deletes logged in user
@DeleteMapping("/delete")
public ResponseEntity<?> deleteUser(Principal principal) {
    userService.deleteUser(principal);
    return ResponseEntity.ok(principal.getName());
}

我仍然对在 REST 控制器中返回什么感到非常困惑 - 是否一切都必须只是 JSON(我知道我也可以使用 XML(和其他一些(,但选择了 JSON(+ 状态代码?当我尝试为该 Web 应用程序构建前端时,它会易于使用吗?

试试这个可以有任何帮助

// CREATE A USER
@PostMapping("/register")
public @ResponseBody ResponseEntity<JSONObject> createUser( @RequestBody User user ) {
    JSONObject responseJson = new JSONObject();
    if (userService.userExists(user)) {
        responseJson.put("status", "User with that username already exists.");
        return new ResponseEntity<JSONObject>(responseJson, HttpStatus.BAD_REQUEST);
    }
    responseJson.put("status", "User created.");
    return new ResponseEntity<JSONObject>(responseJson, HttpStatus.OK);
}

使用可选方法的便捷方法:

    @PostMapping("/register")
    /* */
    Optional<User> optionalUser = userService.findUserById(userId);
    // or userService.findUserByName(username);
    return Optional.ofNullable(optionalUser)
        .map(u -> {
                 return getBadRequestResponse(Sting.format("User with name : %s already exists", username));
             }
        ).orElse(getSuccessfulResponse(
                     new userService.addUser(user)));
[...]
  protected ResponseEntity getSuccessfulResponse(Object result) {
     return new ResponseEntity(result, HttpStatus.OK);
  }
  protected ResponseEntity getBadRequestResponse(String message) {
    return new ResponseEntity(new RestErrorResponse(message),   HttpStatus.BAD_REQUEST);
  }

最新更新