选 post 还是 get 取决于是否改变服务器状态:修改用 post,只读用 get;表单默认 method 为 get 是 html 规范强制要求;get 参数拼在 url 中受长度限制(2048–8192 字符),超限则截断;post 传文件必须设 enctype="multipart/form-data";前后端取参路径不同(如 express 中 get 用 req.query、post 用 req.body);post 不加密,仅减少敏感信息暴露。

选 POST 还是 GET,不看数据多不多,而看这个操作会不会改变服务器状态——改了就用 POST,只读就用 GET。
表单没写 method 属性时,默认走 GET
这是 HTML 规范硬性规定的,不是浏览器“默认推荐”,而是强制行为。哪怕你写了 methd="post"(拼错了),浏览器也当它不存在,照样发 GET 请求。
常见现象包括:
- 登录后 URL 出现
/login?password=123456 - 刷新页面不弹“重新提交表单”提示(说明根本没发过 POST)
- 后端收不到
req.body,但req.query里全是字段
验证方式:打开浏览器 Network 面板,直接看请求的 Method 列是 GET 还是 POST,别信代码注释或标签外观。
GET 会把所有参数拼进 URL,有硬性长度限制
主流浏览器对 URL 总长限制在 2048–8192 字符之间。一旦超限,超出部分直接被截断,后端收到的 req.query 就是残缺的——这不是后端配置问题,是 HTTP 协议层就卡死了。
容易踩坑的场景:
使用 Puppeteer + Chrome 将 HTML 渲染为中文 PDF,自动处理图表等待、Tab 展开、动画、测高、白边消除、防分页,适用于看板、报表、网页和交互图表转 PDF。
- 富文本编辑器输出的 HTML 片段 → URL 爆掉,参数全丢
- 带多个
<input type="hidden">的筛选表单 → 拼接后轻松破 4KB -
action="/search?tab=active"带原始查询参数 →GET提交时,?tab=active会被覆盖或忽略,只剩表单字段
POST 必须配对 enctype 才能传文件
method="post" 只是把数据塞进请求体,但默认编码类型是 application/x-www-form-urlencoded,它只能处理键值对,完全不支持二进制文件。
如果你用了 <input type="file"> 却没加 enctype="multipart/form-data":
- PHP 中
$_FILES是空数组 - Node.js Express 中
req.file或req.files是undefined - 后端中间件如
express.urlencoded()对 multipart 完全无效,必须换multer等专用解析器
注意:enctype 只对 POST 生效,GET 完全无视它。
前后端取参机制完全不同,不能混用
GET 和 POST 在服务端走两套独立的数据通道:
- Express:前端
GET→ 后端读req.query;POST→ 读req.body(需配中间件) - PHP:
$_GETvs$_POST - Flask:
request.argsvsrequest.form
典型错误:
- 前端用
method="get",后端却查req.body→ 一直为空 - 前端用
method="post",但没配express.urlencoded({ extended: true })→req.body始终是{} - AJAX 场景下手动发
POST却设Content-Type: application/json→ 原生<form></form>根本不支持,必须用fetch或XMLHttpRequest
最常被忽略的一点:安全性不是加密,而是暴露面控制。POST 不等于“加密传输”,HTTP 明文下,两者一样能被 Wireshark、Fiddler 完整捕获;POST 的价值只是让敏感参数不出现在 URL、历史记录和代理日志里。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










