为了账号安全,请及时绑定邮箱和手机立即绑定

替代响应 spring boot api 休息

替代响应 spring boot api 休息

守候你守候我 2024-01-05 16:13:03
我是 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 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

在这里,您使用与请求正文和响应正文相同的对象。这不是标准做法。

您应该有单独的请求/响应对象。在请求对象中,您应该只从用户那里获得您需要的信息。但是在响应对象中,您应该包含要在响应中发送的信息以及验证信息,例如错误详细信息,其中包括错误代码和错误描述,您可以使用它们向用户显示验证错误。

希望这可以帮助。


查看完整回答
反对 回复 2024-01-05
?
米脂

TA贡献1836条经验 获得超3个赞

好吧,如果date_expiration过期或identification_card不符合客户的要求,这就是商业失败。

我喜欢用 来表示业务错误HTTP 422 - Unprocessable Entity

如果您想在控制器中返回不同的对象,您可以将返回对象从 更改ResponseEntity<CreditCard>为,但如果目的是返回错误,我更喜欢在带注释的方法中使用 a 。ResponseEntity<Object>ExceptionHandlerControllerAdvice

正如我所说,这种情况是业务失败(信用卡已过期或对当前用户不适用)。

这是一个例子。会是这样的:

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"

}


查看完整回答
反对 回复 2024-01-05
  • 2 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信