복붙노트

[SPRING] 가장 좋은 방법은 봄 부팅에 응답을 보내

SPRING

가장 좋은 방법은 봄 부팅에 응답을 보내

나는 봄 부팅에 REST의 API를들 코딩하고 있습니다. 내 코드는 자신감의 API 개발 도구 (자신감)를 사용하여 프런트 엔드 개발자 읽을 수 있는지 확인하려면. 예를 들면

@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 개체입니다, 브랜치 개체입니다. 그래서 모두는 응답에 따라 수행 할 수있다. 그러나 자신감의 UI는 내가 사용하기 때문에 응답이, 표시 방법을 표시하지 않습니다 "?" 일반적인 유형으로. 이 오류를 잡을 수있는 가장 좋은 방법인가? (는 응답 객체를 표시하지 않기 때문에이 코딩 문서 자신감 프런트 엔드 개발자들에게 유용하지 않습니다). 또는 위의 문제에 대한 가장 좋은 방법은?

지점 같은 다른 개체를 반환하는 방법이 많이 있습니다

해결법

  1. ==============================

    1.우선 당신은 편안하고 API의 모범 사례를 따라야합니다. 동사를 사용하지 않는 대신 URL.So 대신 @GetMapping ( "/ getOne")와 같은 명사를 사용, 당신은 쓸 수 있습니다 그것은 @GetMapping ( "/ 지점 / {ID}") 등. 이 블로그 https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/를 참조 할 수 있습니다

    우선 당신은 편안하고 API의 모범 사례를 따라야합니다. 동사를 사용하지 않는 대신 URL.So 대신 @GetMapping ( "/ getOne")와 같은 명사를 사용, 당신은 쓸 수 있습니다 그것은 @GetMapping ( "/ 지점 / {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"
        ]
    }
    
  2. ==============================

    2.나는 이런 식으로 할 추천 할 것입니다.

    나는 이런 식으로 할 추천 할 것입니다.

    @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 잘못된 요청입니다. 여기에 더 이상 모호한 유형이있을 실 거예요 ..

  3. from https://stackoverflow.com/questions/55789337/best-practice-to-send-response-in-spring-boot by cc-by-sa and MIT license