在spring boot中发送REST响应的最佳方式

dud*_*nii 3 java rest spring controller response

在春季启动时发送休息响应的最佳方法是什么?另外我应该如何管理发送状态代码才能正确完成?

目前我使用ResponseEntity,但我怀疑这是最优雅的方式.

示例代码:

@PostMapping()
public ResponseEntity post(@Valid @RequestBody Item item, BindingResult bindingResult){

    if (bindingResult.hasErrors()){
        return new ResponseEntity<>(new ModelErrors(bindingResult), HttpStatus.BAD_REQUEST);
    }

    return new ResponseEntity<>(itemService.addItem(item), HttpStatus.CREATED);
}
Run Code Online (Sandbox Code Playgroud)

ModelErrors类扩展了HashMap类,只是获取并包装BindingResult的错误消息.

zer*_*pha 8

就个人而言,我认为返回将ResponseEntity是许多案件的最佳选择.在我看来,这样做的一个小更可读的方式是使用方便的状态方法上ResponseEntity这样

@PostMapping()
public ResponseEntity post(@Valid @RequestBody Item item, BindingResult bindingResult){

    if (bindingResult.hasErrors()){
        return ResponseEntity.badRequest().body(new ModelErrors(bindingResult));
    }

    return ResponseEntity.created().body(itemService.addItem(item));
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用status传递HttpStatus此类或状态代码的方法

ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ModelErrors(bindingResult));
ResponseEntity.status(201).body(itemService.addItem(item));
Run Code Online (Sandbox Code Playgroud)

另一种选择是在不使用的情况下返回您想要的任何类型ResponseEntity,但是这使您对响应的控制更少,并且要求您具有正确的MessageConverter配置(您可以在此处阅读).

一个简单的例子可能看起来像这样

@RequestMapping("/hotdog")
public Hotdog hotdog() {
    return new Hotdog("mystery meat", "ketchup, mustard");
}
Run Code Online (Sandbox Code Playgroud)

如果一切都配置正确,你最终会得到这样的回应

{
    "content": "mystery meat",
    "condiments": "ketchup, mustard"
}
Run Code Online (Sandbox Code Playgroud)