我正在构建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);
}