错误;HTML表单未指定method属性时,默认使用GET方法提交,而非POST,这是W3C规范明确规定的硬性行为。

表单不写 method 属性时一定走 GET
浏览器根本不关心你“想”用什么方法——只要 method 属性缺失或拼错(比如写成 methd="post"),它就按 HTML 标准强制走 GET。这不是兼容性 fallback,是硬性行为。
常见错误现象:/login?password=123456 出现在地址栏里;刷新页面弹出“重新提交表单”提示却没出现(说明根本不是 POST);后端收不到 req.body 却在 req.query 里看到一堆字段。
- 检查方式最直接:打开浏览器 Network 面板,看提交那条请求的
Method列是GET还是POST,别信代码注释或 form 标签外观 - Vue/React 项目中,
<form>可能被框架拦截并转成fetch(url + '?' + params),表面是 form,实际发的是 GET - 低代码平台生成的“表单提交”动作,很多默认走 location.href 跳转,本质仍是 GET
GET 参数全在 URL 里,POST 数据在请求体中
这是所有差异的起点。GET 把 name=value 编码后拼进 URL 查询字符串,服务器从 req.query(Express)、$_GET(PHP)等读取;POST 把同样内容放在 HTTP 请求体里,需后端主动解析才能进 req.body 或 $_POST。
容易踩的坑:
立即学习“前端免费学习笔记(深入)”;
- 前端用
fetch('/api', { method: 'POST' })却没传body选项 → 发出空 POST,Content-Length: 0,后端中间件可能跳过解析逻辑,req.body为空对象 - 后端 Express 没配
express.urlencoded({ extended: true })→ 表单 POST 的application/x-www-form-urlencoded数据进不了req.body - 上传文件时只写
method="post",没加enctype="multipart/form-data"→ 后端收不到req.files或$_FILES
选 GET 还是 POST 不看数据量大小,而看操作语义
很多人以为“数据少用 GET,多用 POST”,这是误导。关键在于:这个请求是否会产生副作用。
适合 GET 的场景:
- 搜索关键词:
/search?q=react&page=2,可收藏、可缓存、刷新无害 - 获取文章详情:
/post/123,幂等,多次请求结果一致 - 筛选列表:
/products?category=shoes&sort=price,URL 即状态,利于前端路由同步
必须用 POST 的场景:
- 登录、注册、修改密码:哪怕只传两个字段,也涉及状态变更和敏感信息
- 提交评论、创建订单:每次提交都新增资源,非幂等
- 任何含
<input type="password">的表单:密码明文出现在 URL 是严重安全问题
POST 不等于绝对安全,HTTPS 才是底线
POST 把参数藏在请求体里,只是让地址栏不显示、历史记录不保存、代理日志不易抓取,但 HTTP 明文下,请求体照样能被中间人截获。真正防窃听靠的是 HTTPS。
性能与兼容性影响:
- GET 请求可被 CDN、浏览器、代理缓存,POST 基本不缓存
- 某些企业防火墙会限制长 URL(超 2KB 的 GET 查询串),但对 POST 更宽容
- PHP 默认
post_max_size=8M,Nginx 有client_max_body_size,Node.js 需手动设 body-parser 限制 —— POST 大小不是无限的,只是上限更高
最常被忽略的一点:前后端 Content-Type 和解析逻辑必须严格匹配。传 application/json 却用 urlencoded 中间件,或传 multipart/form-data 却没用 multer,数据就“消失”了——不是没发,是发了但没人认得出来。



















