首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在spring引导中发送响应的最佳实践

在spring引导中发送响应的最佳实践
EN

Stack Overflow用户
提问于 2019-04-22 05:00:44
回答 2查看 10.7K关注 0票数 6

我在弹簧靴上编码REST - Api-s。我希望确保使用swagger开发工具(昂首阔步)的前端开发人员能够阅读我的代码。例如

代码语言:javascript
复制
@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);
        }
    }

如果请求成功,响应是分支对象,如果失败,则响应是只有一个属性(message)的FindError对象。因此,两者能否实现取决于反应。但是,swagger没有显示如何显示响应,因为我使用"?"作为泛型。这是捕捉错误的最佳实践吗?(这种编码文档的虚张声势对前端开发人员没有用处,因为它没有显示响应对象)。或者对上述问题有什么最佳做法?

返回不同对象的方法有很多,如分支。提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-22 08:17:19

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

@2),不要将泛型类型返回为,而是可以使用特定类型,此处为分支,并执行中心异常处理。下面的代码片段可以帮助您:

代码语言:javascript
复制
@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

代码语言:javascript
复制
@ResponseStatus(HttpStatus.NOT_FOUND)
public class RecordNotFoundException extends RuntimeException
{
    public RecordNotFoundException(String exception) {
        super(exception);
    }
}

CustomExceptionHandler.java

代码语言:javascript
复制
@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

代码语言:javascript
复制
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,您也可以定制有效负载验证。

测试用例:

代码语言:javascript
复制
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"
    ]
}
票数 21
EN

Stack Overflow用户

发布于 2019-04-22 06:26:26

我建议这样做。

代码语言:javascript
复制
@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是OK,400是坏请求。这里不再有模棱两可的类型

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55789337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档