Альтернативный ответ пружинный загрузчик api rest - PullRequest
0 голосов
/ 28 октября 2019

Я новичок в REST API и Spring Boot. У меня есть сомнения относительно того, как обрабатывать различные ответы на запрос. Например, если я публикую данные кредитной карты

{
    "number": "3434 3434 3434 3434",
    "date_expiration": "09-19",
    "identification_card": 23232323
}

, тогда в @ RestController

@PostMapping("/card")
public ResponseEntity<CreditCard> payCard(@Valid @RequestBody CreditCard creditCard){
      CreditCard creC = cardService.registerCard(creditCard);
      return new ResponseEntity<>(creC, HttpStatus.OK);    
}

В этом случае я возвращаю объект ResponseEntity. Что произойдет, если срок действия date_expiration истек или identification_card не соответствует клиенту? Это логические проверки, которые разрешаются в службе и могут вызывать разные ответы. Как я должен справиться с ними?

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Что ж, если срок действия date_expiration истек или identification_card не относится к клиенту, это провал бизнеса.

Мне нравится представлять бизнес-ошибки с HTTP 422 - Unprocessable Entity. См. здесь

Вы можете изменить возвращаемый объект с ResponseEntity<CreditCard> на ResponseEntity<Object>, если хотите вернуть различные объекты в свой контроллер, хотя я предпочитаю использовать ExceptionHandler вControllerAdvice аннотированный метод, если целью является возвращение ошибок.

Как я уже сказал, эта ситуация является бизнес-ошибкой (срок действия кредитной карты истек или она не относится к текущему пользователю).

Вот пример. Было бы что-то вроде этого:

CardService.java

@Service
public class CardService {

    // ..

    public CreditCard registerCard(CreditCard card) throws BusinessException {
        if(cardDoesntBehaveToUser(card, currentUser()))) // you have to get the current user
            throw new BusinessException("This card doesn't behave to the current user");

        if(isExpired(card)) // you have to do this logic. this is just an example
            throw new BusinessException("The card is expired");

        return cardRepository.save(card);
    }

}

CardController.java

@PostMapping("/card")
public ResponseEntity<Object> payCard(@Valid@RequestBody CreditCard creditCard) throws BusinessException {
    CreditCard creC = cardService.registerCard(creditCard);
    return ResponseEntity.ok(creC);
}

BusinessException.java

public class BusinessException extends Exception {

    private BusinessError error;

    public BusinessError(String reason) {
        this.error = new BusinessError(reason, new Date());
    }

    // getters and setters..
}

BusinessError.java

public class BusinessError {

    private Date timestamp
    private String reason;

    public BusinessError(String Reason, Date timestamp) {
        this.timestamp = timestamp;
        this.reason = reason;
    }

    // getters and setters..
}

MyExceptionHandler.java

@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {

    // .. other handlers..

    @ExceptionHandler({ BusinessException.class })
    public ResponseEntity<Object> handleBusinessException(BusinessException ex) {
        return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body(ex.getError());
    }

}

Если срок действия кредитной карты истек, JSON будет отображаться как:

{
  "timestamp": "2019-10-29T00:00:00+00:00",
  "reason": "The card is expired"
}
0 голосов
/ 28 октября 2019

Здесь вы используете тот же объект, что и ваше тело запроса и тело ответа. Это не стандартная практика.

У вас должны быть отдельные объекты для запроса / ответа. В объекте запроса у вас должна быть только та информация, которая вам нужна от пользователя. Но в объекте ответа у вас должна быть информация, которую вы хотите отправить в ответе, а также информация о проверке, например, Сведения об ошибке, которая включает код ошибки и описание ошибки, которые можно использовать для отображения ошибки проверки пользователю.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...