浏览器仅支持表单method="get"和"post",其余如"PUT"会静默降级为GET;RESTful请求须用fetch/axios显式指定method,且enctype决定数据格式而非method。

浏览器根本不认 PUT、DELETE 这类 method 值
写 method="PUT" 或 method="DELETE",浏览器不会报错,也不会发对应请求——它直接静默降级为 get。这不是兼容性问题,是规范层面的拒绝:HTML 标准只定义 get 和 post 两种合法值,其余全部无视。
常见错误现象:
- Network 面板里看到的始终是 GET 请求,哪怕写了
method="PUT" - 后端收不到 body 数据(因为实际走的是 get,参数全塞 URL 里了)
- W3C 验证器标红,SSR 渲染时可能被解析为无效属性
想用 RESTful 动词?得靠 JavaScript 手动发请求
method 属性只对原生表单提交起作用。一旦你调用 event.preventDefault(),再用 fetch 或 axios 发请求,form.method 的值就只是个字符串,不会自动变成 HTTP 方法。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 读取表单的
method属性仅作参考:const httpMethod = form.method.toUpperCase(),但别指望它能驱动 fetch - 真正发请求时,必须显式指定:
fetch(action, { method: 'PUT', body: formData }) - 如果表单含文件上传,
enctype="multipart/form-data"仍需保留,否则FormData构造会漏掉文件字段
后端接收不到 POST 数据?先查 enctype 是否匹配
method="post" 只管“怎么发”,不管“怎么打包”。真正决定数据格式的是 enctype,它和 method 是绑定搭档。
典型失配场景:
- 没写
enctype,默认是application/x-www-form-urlencoded,但后端用multer等 multipart 解析器——结果 body 为空 - 写了
enctype="multipart/form-data"却没传文件,部分框架(如 Express)默认不解析该类型,导致req.body为空 - 用了
enctype="text/plain",空格变+、特殊字符不编码,后端难还原原始值
SPA 中 get 表单刷新丢失参数?不是 method 的锅
写 method="get" 提交后跳转到 /search?q=xxx,一刷新就 404,这跟 method 无关,而是前端路由没配 fallback。
根本原因:
- 原生
get表单本质是导航,触发完整页面跳转 - React Router / Vue Router 的 history 模式需要服务端把所有非 API 路径都返回
index.html - 否则 Nginx/Apache 直接返回 404,连 JS 都没机会执行
临时绕过办法:用 fetch + URLSearchParams 拼查询串,再用 history.pushState() 更新地址栏,避免跳转。
最容易被忽略的一点:你在 form 上写的 method,只在用户“不干预”提交时才生效;只要加了一行 event.preventDefault(),它就彻底退化成一个普通字符串——别再指望它能自动映射到 fetch 的 method 选项里。



















