替代响应 spring boot api 休息

我是 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与客户端不对应怎么办?它们是在服务中解析的逻辑验证,可以触发不同的响应。我应该如何处理它们?


守候你守候我
浏览 99回答 2
2回答

慕尼黑8549860

在这里,您使用与请求正文和响应正文相同的对象。这不是标准做法。您应该有单独的请求/响应对象。在请求对象中,您应该只从用户那里获得您需要的信息。但是在响应对象中,您应该包含要在响应中发送的信息以及验证信息,例如错误详细信息,其中包括错误代码和错误描述,您可以使用它们向用户显示验证错误。希望这可以帮助。

米脂

好吧,如果date_expiration过期或identification_card不符合客户的要求,这就是商业失败。我喜欢用 来表示业务错误HTTP 422 - Unprocessable Entity。如果您想在控制器中返回不同的对象,您可以将返回对象从 更改ResponseEntity<CreditCard>为,但如果目的是返回错误,我更喜欢在带注释的方法中使用 a 。ResponseEntity<Object>ExceptionHandlerControllerAdvice正如我所说,这种情况是业务失败(信用卡已过期或对当前用户不适用)。这是一个例子。会是这样的:CardService.java@Servicepublic 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.javapublic class BusinessException extends Exception {    private BusinessError error;    public BusinessError(String reason) {        this.error = new BusinessError(reason, new Date());    }    // getters and setters..}BusinessError.javapublic 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@ControllerAdvicepublic 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"}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java