在Java中,幂等和非幂等的概念主要在于它们如何处理相同输入的重复调用。理解这些概念对于设计稳健的API来说尤其重要,特别是在与远程服务或数据库交互的时候。
幂等性操作一个幂等操作是可以多次执行而不会产生额外效果的操作。换句话说,执行一次或多次操作的结果是一样的。特别是在分布式系统中,这一点尤为重要,因为在网络故障的情况下,可能导致请求被重复发送。
HTTP 方法(例如): 在 REST API 中,GET
、PUT
和 DELETE
方法都被认为是幂等的。
示例情景:
- HTTP DELETE 请求:想象一个 RESTful API 用于删除用户的账户。如果你多次向
/users/123
发送 DELETE 请求,第一次发送的请求会成功删除 ID 为 123 的用户。任何后续的 DELETE 请求将不再有任何影响,因为用户已经不存在了。因此,这个操作具有幂等性。
// 幂等的 DELETE 请求
@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable String id) {
userService.deleteUserById(id);
return ResponseEntity.noContent().build();
}
// 注释:幂等的操作意味着多次执行该操作与一次执行的效果相同。
场景说明:HTTP DELETE 请求场景
删除请求 : DELETE /users/123
开始行动:
- 第一个请求是:你发送一个 DELETE 请求来删除 ID 为 123 的用户。
- 输出:用户删除成功,服务器可能会返回这样的状态码,例如
204 No Content
。
2. 第二个请求:再次发送同样的DELETE请求就可以了。
- 输出结果:服务器再次尝试删除用户,但由于用户已经不存在了,可能会返回
404 Not Found
这样的状态码。
整体输出的解释:
- 第一次执行会删除用户(用户已被删除)。
- 之后的执行不会进一步改变状态(用户已删除),因此在第一次操作之后,输出保持一致。这就是为什么删除操作具有幂等性。
另一方面,非幂等的运作 每次执行都会改变状态,这意味着重复相同的输入会得到不同的结果。这一点尤其重要,因为这可能导致重复操作时出现意外的副作用。
HTTP 方法: POST
方法一般不具备幂等性。例如,POST /resource
每次调用都会创建一个新的资源实例,重复调用会导致多个实例的存在。
示例情景:
- HTTP POST 请求:考虑一个用于创建新用户账户的 API。每次你向
/users
发送 POST 请求, ,它会创建一个具有唯一标识符的新用户账户。如果你多次发送相同的 POST 请求,你将会创建多个用户账户,从而导致不同的结果和情况。
// 非幂等的 POST 请求
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
User createdUser = userService.createUser(user);
return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
}
场景:HTTP POST 请求
请求方法: POST /users
执行:
- 第一个请求是:你发出一个 POST 请求来创建一个具有具体信息的新用户账号。
- 输出:用户已被创建,服务器可能会返回一个状态码如
201(创建成功)
,并包括一个独一无二的用户ID。
2. 第二次请求:再次使用相同的用户详细信息发送相同的 POST 请求内容。
- 输出结果:创建了一个具有不同的唯一ID的新用户,服务器再次响应
201 Created
和新用户的详细信息。
- 在幂等操作中,输出在第一次执行后就稳定了,因为再执行也不会改变结果(例如,删除一个已被删除的资源)。
- 在非幂等操作中,每次执行都会产生不同的输出,每次调用都会创建新的资源,每次调用都会改变状态(例如,每次调用都会创建新的资源)。
如果你觉得这些文章有用,请考虑多点几个赞 __👏__ ,并把它分享给你的朋友和同事。以后需要时可以参考。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦