form 的 method 属性仅支持 get 和 post,其他值如 put、delete 会静默降级为 get;get 用于查询,参数在 url 中,有长度和安全限制;post 用于修改,参数在请求体中,无长度限制但需防重复提交。

form 的 method 属性只能是 get 或 post
浏览器只认这两个值,其他如 PUT、DELETE 会自动 fallback 成 get,不是报错,而是静默降级——这点很多人调试半天才发现后端根本没收到请求。
真实场景里:get 适合查数据(比如搜索框),参数拼在 URL 后;post 适合改数据(比如登录、提交订单),参数走请求体。
-
get提交的数据会出现在地址栏,有长度限制(通常 2KB 左右,取决于浏览器和服务器),且不加密,别传密码或敏感信息 -
post没有 URL 长度限制,但默认不支持刷新重发(浏览器会弹确认框),也不被缓存 - 如果真要用
PUT或DELETE,得用 JavaScript 发起fetch或XMLHttpRequest,不能靠原生<form method="put"></form>
为什么 get 表单一提交就跳转,而 post 看起来“更安静”
这不是 method 本身决定的,而是浏览器对两种方法的默认行为差异:前者把所有字段编码进 URL,后者把字段放进请求体,页面跳转与否取决于有没有指定 action 地址,以及服务端是否返回新页面。
常见误解是“post 不跳转”,其实只要 action 指向一个 HTML 页面,照样跳;想不跳就得配合 JS 拦截提交,或者让后端返回 JSON 而非 HTML。
立即学习“前端免费学习笔记(深入)”;
- 检查是否意外写了
action=""或漏写action,会导致表单提交到当前 URL,看起来像“刷新” -
get表单的 URL 编码由浏览器自动完成,空格变%20,中文变%E4%BD%A0,不用手动处理 - 服务端接收
get参数一般用request.query(Node.js)或$_GET(PHP),post则用request.body或$_POST,别混用
enctype 和 method 必须配对用
表单要不要传文件,不只看 method,还得看 enctype。比如 <form method="post" enctype="multipart/form-data"></form> 才能上传文件;如果只写 method="post" 却没设 enctype,文件字段会变成空字符串。
-
application/x-www-form-urlencoded(默认值):普通文本字段,键值对 URL 编码,适合大多数情况 -
multipart/form-data:必须用于含<input type="file">的表单,否则文件内容不会发送 -
text/plain:基本没人用,空格不编码,仅用于调试观察原始值,不推荐生产环境
Chrome 开发者工具里怎么验证实际发出的请求方法
别光看 HTML 代码里的 method,直接开 Network 面板,点一下表单提交,找对应请求,看 Headers 标签页里的 Request Method 字段——这才是真实发出的方法。
- 如果看到
GET但你写了method="post",大概率是表单外层被 JS 拦截并手动调了location.href之类 - 如果看到
OPTIONS请求在前面,那是 CORS 预检,说明你用 JS 提交时设置了自定义 header,和原生form无关 - 移动端 WebView 有时会因缓存或拦截导致
method失效,建议在真机上用远程调试确认
最麻烦的不是设错 method,而是前后端对“该用哪个方法”的理解不一致——比如前端用 get 提交修改操作,后端又恰好没做幂等防护,结果用户手抖点了两下,数据就被改了两次。











