在Spring MVC中的@GetMapping方法中执行更新操作是否可以接受?

问题描述 投票:0回答:1
// Read received message
@GetMapping(value = "msgReadReceived")
public String readReceivedMessage(@RequestParam("msg_no") Long msgNo, Model model) {
    // Retrieve the message using msgNo
    Message receivedMessage = msgService.getReceivedMessageById(msgNo);

    // If the read date is 'null', perform an update
    if (receivedMessage.getMsg_readdate() == null) {
        // Update msg_readdate when the message is clicked
        msgService.updateReadDate(msgNo);
        // Retrieve the message again after the update
        receivedMessage = msgService.getReceivedMessageById(msgNo);
    }

    model.addAttribute("receivedMessage", receivedMessage);

    // Redirect to the message reading page
    return "kdw/msgReadReceived";
}

我有一个用 @GetMapping 注释的 Spring MVC 方法,在其中检索并显示收到的消息。如果读取日期为空,我会在单击消息时更新它,然后在更新后再次检索消息。我很好奇在 Spring MVC 中的 @GetMapping 方法中执行更新操作是否被认为是可接受的。如果不鼓励这种做法,我尝试分离逻辑,但由于我的知识有限,目前面临挑战。我非常感谢有关在 Spring MVC 中处理此类场景的最佳实践的指导。如果不推荐这种方法,那么任何实现适当分离的帮助都是非常宝贵的。

java spring spring-boot spring-mvc mybatis
1个回答
0
投票

HTTP 使用

@GetMapping
GET
方法有一些原理。
GET
旨在实现安全且幂等,这意味着它不应更改服务器的状态,并且多个相同的请求应产生相同的结果结果。 这个原则是 Web 开发实践之一。

您在访问消息时更新消息的读取日期,此操作不是幂等的,因为它会更改消息的状态(从未读到已读),更合适的是使用不同的 HTTP 方法来表示消息的更改服务器的状态,例如

POST
PUT
PATCH

接下来,您可以使用两种方法:一种用于获取消息(使用

GET
),另一种用于将消息标记为已读(使用
POST
PUT
)。

  1. 获取消息:
@GetMapping(value = "msgReadReceived")
public String readReceivedMessage(@RequestParam("msg_no") Long msgNo, Model model) {
    Message receivedMessage = msgService.getReceivedMessageById(msgNo);
    model.addAttribute("receivedMessage", receivedMessage);
    return "kdw/msgReadReceived";
}
  1. 将消息标记为已读:
@PostMapping(value = "msgMarkAsRead")
public String markMessageAsRead(@RequestParam("msg_no") Long msgNo, Model model) {
    Message receivedMessage = msgService.getReceivedMessageById(msgNo);
    if (receivedMessage.getMsg_readdate() == null) {
        msgService.updateReadDate(msgNo);
        receivedMessage = msgService.getReceivedMessageById(msgNo);
    }
    model.addAttribute("receivedMessage", receivedMessage);
    return "redirect:/msgReadReceived?msg_no=" + msgNo;
}

readReceivedMessage
方法仍然是
GET
请求,遵循不修改服务器状态的原则。
markMessageAsRead
方法是
POST
请求,适用于将消息标记为已读的操作。 这个逻辑遵循RESTful服务的原则,其中每个方法都有不同的含义。 最后,如果您使用此逻辑,请在整个应用程序中保持一致,而不仅仅是其中的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.