表单不写 method 属性时默认用 GET 提交;GET 将数据拼在 URL 中,适合无副作用查询,但敏感信息会暴露且长度受限;POST 将数据放请求体,适合改数据、传文件等操作,需配中间件解析。

表单默认用什么方法提交
不写 method 属性时,浏览器一律按 GET 提交。这不是规范“建议”,而是 HTML 标准强制行为——哪怕你只漏写了 method="post",它就自动变成 GET。
常见错误现象:form 提交后 URL 突然冒出一堆参数,刷新页面还重复提交,或者敏感内容(比如密码)明文出现在地址栏里。
使用场景决定方法:查数据、分页、筛选这类无副作用操作适合 GET;改数据、传文件、含敏感字段的操作必须用 POST。
GET 和 POST 在 URL 和服务器端表现不同
GET 把所有字段拼进 URL 查询字符串,服务器从 request.query(或类似 $_GET)读;POST 把数据放在请求体里,服务端要从 request.body(或 $_POST)解析。
立即学习“前端免费学习笔记(深入)”;
容易踩的坑:
- 前端用
GET提交大量文本,URL 超长导致 414 错误(服务器拒绝处理过长 URL) - 后端只检查
$_POST却忽略$_GET,结果GET表单提交的数据“消失”了 - 用
POST但没设enctype,上传文件时后端收不到files字段
怎么让表单真正走 POST
光写 <form method="post"> 不够,还得注意三件事:
- 确保没有 JavaScript 拦截提交后手动触发
location.href或fetch用GET发请求 - 如果用了
fetch或axios提交,必须显式写method: 'POST',否则默认是GET - 后端框架(如 Express、Django)可能默认不解析
POST的application/x-www-form-urlencoded,得配好中间件(比如 Express 的express.urlencoded())
简短示例:<form method="post" action="/login"><input name="password"></form> 这样才走 POST;若 JS 里写 fetch('/login?password=123'),还是 GET。
浏览器地址栏里能看到数据就是 GET
这是最直接的判断依据。只要提交后 URL 变了、带了 ? 和参数,不管代码怎么写,实际就是 GET 请求。
性能与兼容性影响:
-
GET请求可被缓存、能被收藏为书签,POST不行 -
GET参数长度受浏览器和服务器双重限制(通常 2KB–8KB),POST理论上只受限于服务器配置 - 某些老旧代理或防火墙会拦截或篡改带长查询字符串的
GET,但对POST更宽容
复杂点在于:有些前端框架(如 Vue + router-link)或低代码平台会悄悄把表单转成 JS 驱动的 GET 跳转,表面是 form,实际没发 POST 请求——得看 Network 面板里的 Method 列,别信代码注释。











