当前位置: 首页 > 知识库问答 >
问题:

在spring boot中发送响应的最佳实践

孙嘉
2023-03-14

我正在spring boot中编写RESTAPI-s。我想确保我的代码对于使用swagger API开发工具(swagger)的前端开发人员是可读的。例如

@GetMapping("/getOne")
    public ResponseEntity<?> getOne(@RequestParam String id) {
        try {
            return new ResponseEntity<Branch>(branchService.getOne(id), HttpStatus.OK);
        } catch (Exception e) {
            return new ResponseEntity<FindError>(new FindError(e.getMessage()), HttpStatus.BAD_REQUEST);
        }
    }

如果请求成功,响应是一个分支对象,如果失败,响应是只有一个属性(消息)的FindError对象。因此,这两种方法的执行取决于响应。但是swagger UI没有显示响应应该如何显示,因为我使用了“?”作为泛型类型。这是捕捉错误的最佳实践吗?(这种编码文档的虚张声势对前端开发人员没有用处,因为它不显示响应对象)。或者有解决上述问题的最佳实践吗?

有很多方法可以返回不同的对象,比如布兰奇。事先谢谢

共有2个答案

柯曦
2023-03-14

我建议你这样做。

@GetMapping("/getOne")
public Response getOne(@RequestParam String id) {
        ResponseEntity<Branch> resbranch;
        ResponseEntity<FindError> reserror;
        try {
            resbranch=new ResponseEntity<Branch>(branchService.getOne(id), HttpStatus.OK);
            return Response.status(200).entity(resbranch).build();

        } catch (Exception e) {
            reserror=new ResponseEntity<FindError>(new FindError(e.getMessage()), HttpStatus.BAD_REQUEST);
            return Response.status(400).entity(reserror).build();
        }
    }

200表示正常,400表示错误请求。在这里,将不再有模棱两可的类型。。

霍鸣
2023-03-14

首先,您应该遵循RESTful API的最佳实践。不要使用动词,而是使用名词作为URL.So而不是@GetMap("/getOne"),您可以将其编写为@GetMap("/分支/{id}")。您可以参考此博客https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/

@2ndly,不要将泛型类型返回为?相反,您可以使用特定的类型,这里作为分支,并进行中央异常处理。以下代码片段可以帮助您:

@GetMapping("/branch/{id}")
public ResponseEntity<Branch> getBranch(@Pathvariable String id) {
{
    Branch branch = branchService.getOne(id);

    if(branch == null) {
         throw new RecordNotFoundException("Invalid Branch id : " + id);
    }
    return new ResponseEntity<Branch>(branch, HttpStatus.OK);
}

RecordNotFoundException.java

@ResponseStatus(HttpStatus.NOT_FOUND)
public class RecordNotFoundException extends RuntimeException
{
    public RecordNotFoundException(String exception) {
        super(exception);
    }
}

CustomExceptionHandler.java

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler
{
    @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
        List<String> details = new ArrayList<>();
        details.add(ex.getLocalizedMessage());
        ErrorResponse error = new ErrorResponse("Server Error", details);
        return new ResponseEntity(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(RecordNotFoundException.class)
    public final ResponseEntity<Object> handleRecordNotFoundException(RecordNotFoundException ex, WebRequest request) {
        List<String> details = new ArrayList<>();
        details.add(ex.getLocalizedMessage());
        ErrorResponse error = new ErrorResponse("Record Not Found", details);
        return new ResponseEntity(error, HttpStatus.NOT_FOUND);
    }
}

ErrorResponse.java

public class ErrorResponse
{
    public ErrorResponse(String message, List<String> details) {
        super();
        this.message = message;
        this.details = details;
    }

    private String message;

    private List<String> details;

    //Getter and setters
}

上面的类处理多个异常,包括RecordNotFoundException,你也可以自定义有效负载验证。

测试用例:

1) HTTP GET /branch/1 [VALID]

HTTP Status : 200

{
    "id": 1,
    "name": "Branch 1",
    ...
}
2) HTTP GET /branch/23 [INVALID]

HTTP Status : 404

{
    "message": "Record Not Found",
    "details": [
        "Invalid Branch id : 23"
    ]
}
 类似资料:
  • 我想从spring控制器返回一个字符串(json字符串)作为它接收到的AJAX调用的响应,响应可能会根据我是否提交了@Valid表单而有所不同。这就是我处理它的方式,我想知道这是否被认为是最佳实践?请注意,我使用的是@RestController,所以@ResonseBody应用所有方法。

  • 在我的JavaSwing应用程序中,我实现了一个与jms服务器通信的jms客户机。这很好。 当前,当我的应用程序启动时,我创建连接和会话: 接下来,当我需要向主题发送消息时,我创建了一个主题(发送消息)、一个临时队列(接收回复)、一个生产者(发送消息)和一个消费者(实际读取回复): 我想知道在这种情况下最好的做法是什么? 当我需要发送消息时,我可以简单地创建所有内容吗?或者最好将目标、消息生产者、

  • 问题内容: 因此,这里没有什么新鲜事,我只是想澄清一下,似乎无法在其他帖子中找到任何内容。 我正在重新创建新资源,说: 与身体: 我知道我应该返回带有新资源的Location标头的201(创建的): 我似乎无法为自己回答的问题是服务器应该返回什么内容。 我经常这样做: 我这样做有两个原因: 我已经为诸如angularjs的前端框架编写了api。在我的特定情况下,我使用的是角度资源,我通常只需要ID

  • 我试图遵循API的最佳实践,但我得到了相互矛盾的建议。大多数人建议对URI使用脊柱病例(例如stackoverflow和RFC3986。我有一个API,允许通过各种参数过滤GET请求: < code >获取/终结点?my-parameter=true 但是,我也在 GET 响应和 PATCH 请求中使用相同的参数。在那里,我看到更多的骆驼大小写或snake_case,脊柱大小写是一个额外的语言,不

  • 我想回复ResponseEntity的回复。我对在ResponseEntity中提到返回类型的最佳实践有点困惑。 这是我的控制器: 我的主要责任: 这里我的返回类型是GenericResponse、AdminAccount。在ResponseEntity中提及所有退货类型是否是一种良好的做法? 哪个是最好的方法

  • 想改进这个问题吗 更新问题,通过编辑这篇文章,可以用事实和引用来回答。 API响应应该始终是JSON对象,键和值是json数组吗?因此: 或者 API 响应本身可以只是一个数组?我找不到这方面的最佳实践是什么,如果一个被认为是一个糟糕的方法。