开发二十一点服务时请求数据同时更新资源应选GET还是PATCH
接口HTTP方法选择结论
优先使用POST请求,若仅能在题目给出的GET、PATCH中二选一,必须选择PATCH,绝对不能用GET。
为什么不能用GET
- HTTP 规范明确定义GET为安全方法:多次调用GET请求不应对服务端资源产生副作用(即不能修改服务端状态)。你的
/hit接口每次调用都会向玩家手牌新增卡牌、修改游戏对局状态,属于有副作用的操作,完全不符合GET的语义要求。 - 实际生产环境中GET请求会被浏览器、CDN、代理服务器默认缓存,也可能被爬虫、页面预加载逻辑无意触发,极易导致游戏状态被非预期修改,引发线上故障。
为什么POST比PATCH更适配这个场景
- PATCH的语义是对已有资源做部分增量更新,通常要求客户端在请求体中明确携带要修改的资源字段值,比如修改对局玩家昵称时提交
{"playerName":"newName"}的PATCH请求是符合语义的。 - 你的
/hit接口本质是触发「要牌」这个业务动作,新增的卡牌由服务端内部逻辑随机生成,不需要客户端提交更新内容,这类触发服务端业务操作的场景,用POST是HTTP语义上最标准的选择。
二选一场景下选择PATCH的原因
如果必须在GET、PATCH中做选择,选PATCH:
- PATCH属于非安全方法,不会被各级节点默认缓存,也不会被爬虫等逻辑无意触发,符合修改服务端状态的操作要求。
- 你可以将游戏对局作为独立资源,调用
/hit相当于对游戏对局的手牌字段做增量更新,勉强符合PATCH的部分更新语义。
Spring代码示例
// 推荐写法:用POST触发要牌业务动作 @PostMapping("/games/{gameId}/hit") public GameStatus hit(@PathVariable Long gameId) { // 业务逻辑:给指定对局玩家发新牌,更新对局状态 return gameService.hit(gameId); } // 次选写法:用PATCH做对局部分更新 @PatchMapping("/games/{gameId}/hit") public GameStatus hit(@PathVariable Long gameId) { return gameService.hit(gameId); }
内容的提问来源于stack exchange,提问作者stijuh
相关产品推荐
相关产品推荐

