Best practice to send response in spring boot

前端 未结 2 1769
执念已碎
执念已碎 2021-01-01 04:46

I\'m coding REST Api-s in spring boot. I want to make sure that my code is readable to front-end developers using swagger API development tool (Swagger). For example

相关标签:
2条回答
  • 2021-01-01 05:24

    I would recommend to do it like this .

    @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 is for OK and 400 is for bad request. Here there wont be anymore ambiguous types..

    0 讨论(0)
  • 2021-01-01 05:43

    First of all you should follow the best practices of a RESTful API . Don't use verbs, instead use nouns as URL.So instead of @GetMapping("/getOne") , you can write it as @GetMapping("/branch/{id}") . You can refer this blog https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/

    @2ndly , Don't return a generic type as ? , instead you can user the specific type , here as Branch and do central exception handling . The following code snippet can help you :

    @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
    }
    

    The above class handles multiple exceptions including RecordNotFoundException and you can also customize for payload validations too.

    Test Cases :

    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"
        ]
    }
    
    0 讨论(0)
提交回复
热议问题