GET参数在URL中、可缓存、幂等;POST参数在body中、不缓存、非幂等;选型取决于参数是否需暴露、能否重复提交及数据量大小。

选 GET 还是 POST,不是看“哪个更高级”,而是看数据要不要进 URL、能不能被缓存、会不会重复提交——搞错就可能泄露密码、丢参数、刷出两次订单。
GET 请求参数全在 URL 里,拼错了就收不到
浏览器把 form 所有字段(name/value)自动拼成 query string,追加到 action 的 URL 后面,用 ? 分隔。如果 action 本身已带参数,比如 action="search.php?from=home",那用 GET 提交时,整个 URL 会被重写为 search.php?kwd=xxx&from=home ——但实际行为是:原始 from=home 会被覆盖或丢弃,取决于服务器解析逻辑。多数后端框架(如 Express 的 req.query)只取最终拼出来的 query,不保留 action 原始参数。
- URL 长度受限:Chrome 约 2MB,但实际建议控制在 2KB 内,否则 IE 直接截断
- 所有字段值必须是 URL-safe 编码(空格变
%20,中文变%E4%BD%A0),否则提交失败 -
enctype只能是application/x-www-form-urlencoded;设成multipart/form-data无效,文件字段直接被忽略
POST 请求体里传数据,但后端得主动读 body
表单字段不进 URL,而是以键值对形式塞进 HTTP 请求体。URL 保持干净,比如 action="login.php" 提交后还是 login.php,但请求体里有 username=admin&password=123。注意:这不代表数据加密或安全——HTTP 明文传输下,抓包一样看得一清二楚。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 后端必须从请求体(而非 query string)取参:
req.body(Express)、request.form(Flask)、$_POST(PHP) - 若要上传文件,
enctype必须设为multipart/form-data;否则后端只能收到文件名,拿不到二进制内容 - 没配好中间件(如 Express 没用
express.urlencoded())会导致req.body为空对象
刷新/后退会触发重复提交,POST 尤其危险
GET 刷新只是重发一次查询,无副作用;POST 刷新则可能再次执行创建、支付、删除等操作。浏览器通常会弹出“确认重新提交表单”提示,但这不能依赖——用户点“确定”就真提交了两次。
立即学习“前端免费学习笔记(深入)”;
- 常见修复方式:提交成功后服务端返回 303 Redirect,让浏览器用 GET 访问结果页(Post-Redirect-Get 模式)
- 前端可禁用提交按钮 + 添加 loading 状态,但仅防 UI 层误点,挡不住手动刷新
- 后端需做幂等校验(如用唯一订单号、token 校验),不能只靠前端限制
最容易被忽略的点:前后端对参数来源的约定。比如一个 action="user/edit?id=123" 的表单,用 GET 提交,后端从 req.query.id 取 123 没问题;换成 POST,id=123 会进请求体,req.query 就是空的——除非你同时从 req.query 和 req.body 合并取值,否则直接丢参数。


















