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

发起PUT请求时是否必须携带请求体?计数器API更新实践疑问

计数器应用PUT请求的实现疑问

我开发了一个调用API的简易计数器应用,用户点击+按钮时需要通过PUT请求更新API。现在有个疑问:发起PUT请求时是不是必须按照最佳实践携带请求体?还是可以发送空PUT请求,直接由后端逻辑处理自增操作?

两种实现示例

方案一:发送空请求体的PUT请求

前端代码(/counter.js):

const handleAdd = async () => {
    try {
        const response = await fetch(`/api/counter`, {
          method: "PUT",
          headers: {
            "Content-Type": "application/json"
          },
        });
        const counter = await response.json();
        return counter;
      } catch (err) {
        return null;
      }
  };

return (
<button onClick={() => handleAdd()}> + </button>
)

后端代码(/pages/api/counter.js):

export default async function handler (req, res) {
    // 示例逻辑:获取当前计数器值并自增
    const currentCounter = await getCurrentCounter();
    const newCounter = currentCounter + 1;
    await saveCounter(newCounter);
    return res.status(200).json(newCounter);
}

方案二:携带请求体的通用更新逻辑

前端代码调整(/counter.js):

const handleAdd = async () => {
    try {
        const response = await fetch(`/api/counter`, {
          method: "PUT",
          headers: {
            "Content-Type": "application/json"
          },
          body: JSON.stringify({ increment: 1 })
        });
        const counter = await response.json();
        return counter;
      } catch (err) {
        return null;
      }
  };

return (
<button onClick={() => handleAdd()}> + </button>
)

后端代码(/pages/api/counter.js):

export default async function handler (req, res) {
    const { increment } = req.body;
    const currentCounter = await getCurrentCounter();
    const newCounter = currentCounter + increment;
    await saveCounter(newCounter);
    return res.status(200).json(newCounter);
}

实际选择建议

两种方式都能实现功能,但从RESTful规范和扩展性来看:

  • 空PUT请求不算标准做法,PUT的语义是「将资源更新到指定状态」,通常需要携带明确的更新参数或目标状态。
  • 携带请求体的方式灵活性更高,后续如果要做+2、-1这类不同操作,只需要修改前端传递的参数,后端逻辑不用大改。
  • 如果只是固定的+1小需求,空PUT请求实现简单,小项目里凑合用也没问题,但长期来看扩展性差,不如规范写法靠谱。

内容的提问来源于stack exchange,提问作者Omilight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:32:58