formmethod="put"不被html原生支持,浏览器会降级为post;真正实现put需后端识别_method隐藏字段或前端用fetch/xhr发起真实put请求。

formmethod="put" 本身不被 HTML 原生支持
HTML 规范只允许 formmethod 的值为 get 或 post,put、delete 等是非法值,浏览器会自动降级为 post(甚至可能报警告)。直接写 formmethod="put" 不会触发 PUT 请求。
真正生效的 PUT 提交必须靠后端配合 + 前端模拟
浏览器表单原生只发 GET/POST,想发 PUT,本质是“用 POST 模拟 PUT”,关键在两点:请求方法伪造 + 后端识别。常见做法是:
- 前端把按钮的
formmethod改成post(合法),同时在表单里加一个隐藏字段,比如<input name="_method" value="put" type="hidden"> - 后端框架(如 Laravel、Rails、Express + method-override)识别到
_method=put,就将本次 POST 请求“重写”为 PUT 处理 - 如果不用框架中间件,就得自己解析该字段并手动 dispatch 到 PUT 路由逻辑
纯前端不依赖后端时,只能用 fetch 或 XMLHttpRequest
若后端不支持 _method 伪造,又必须发真实 PUT,就不能用 <button type="submit"></button> 触发表单提交——得拦截默认行为,手动生成请求:
<button type="button" data-url="/api/users/123">更新用户</button>
<script>
document.querySelector('button[data-url]').addEventListener('click', async (e) => {
const url = e.target.dataset.url;
const response = await fetch(url, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Alice', email: 'a@example.com' })
});
});
</script>
注意:type="button" 是必须的,否则仍会触发表单提交;fetch 不会自动携带 cookie(需显式加 credentials: 'same-origin');CSRF token 需手动注入 header 或 body。
容易被忽略的兼容性与安全点
真实项目中这几个细节常导致 PUT 失败:
- 后端未开启 CORS 的
Access-Control-Allow-Methods包含PUT,预检请求(OPTIONS)直接 403 - Spring Boot 默认禁用
_method参数,需配置spring.mvc.hiddenmethod.filter.enabled=true - 使用
fetch时没处理 4xx/5xx 响应,界面卡住无提示 - 表单里多个 submit 按钮共用同一组
name字段,PUT 按钮提交后,后端收不到预期字段(因为没点击的按钮不会提交其name)
伪造方法和真实方法各有适用场景,选哪条路,取决于你能不能改后端、有没有现成中间件、以及是否接受多一次 JS 初始化成本。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











