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

DeleteMapping删除学生报405错误,改用GET是否为不良实践?

问题解答

为什么@DeleteMapping报错405,@GetMapping却可行?

浏览器里的<a>标签点击后默认发送GET请求,而你Controller里的@DeleteMapping("/delete/{id}")只接收HTTP DELETE方法的请求,请求方法不匹配,所以抛出405(Method Not Allowed)错误。

换成@GetMapping时,Controller接收GET请求,和<a>标签的请求方法完全匹配,所以逻辑能正常执行。

用GET请求替代DELETE是不是不良实践?

是,这属于不符合HTTP规范的不良实践:

  • HTTP方法有明确语义:GET用于读取/获取资源,要求是安全(不修改服务器状态)且幂等的;DELETE用于删除资源,是修改服务器状态的操作。用GET做删除完全违背了这种语义约定。
  • 存在实际风险:搜索引擎爬虫、浏览器预加载、用户误触刷新等情况,都可能意外触发删除操作,导致数据丢失。

怎么正确实现删除操作?

推荐两种符合规范的方案:

方案1:用表单模拟DELETE请求

Spring支持通过_method参数将POST请求转换为DELETE请求(Spring Boot默认已启用HiddenHttpMethodFilter)。把<a>标签换成表单:

<form th:action="@{'/students/delete/' + ${student.id}}" method="post" style="display: inline-block;">
  <input type="hidden" name="_method" value="delete">
  <button type="submit" class="btn btn-danger">Delete</button>
</form>

点击按钮时会发送POST请求,Spring会自动转换为DELETE请求,匹配你的@DeleteMapping方法,执行删除后跳转到/students页面。

方案2:用AJAX发送DELETE请求

如果后续需要避免页面刷新,可以用JavaScript发送DELETE请求,完成后再跳转:

// 给删除按钮绑定点击事件
document.querySelectorAll('.delete-btn').forEach(btn => {
  btn.addEventListener('click', function(e) {
    e.preventDefault(); // 阻止默认GET跳转
    const deleteUrl = this.getAttribute('href');
    
    fetch(deleteUrl, {
      method: 'DELETE'
    }).then(() => {
      window.location.href = '/students'; // 删除成功后跳转
    });
  });
});

对应的HTML标签保留,添加class:

<a th:href="@{'/students/delete/' + ${student.id}}" class="btn btn-danger delete-btn">Delete</a>

内容的提问来源于stack exchange,提问作者Tomás Iglesias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:22