You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发二十一点服务时请求数据同时更新资源应选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:57:04