Postman 发送 POST 请求时 HTML 表单数据怎么传?
我在用 Postman 测试一个登录接口,后端是接收 HTML 表单格式的 POST 数据(Content-Type: application/x-www-form-urlencoded),但我试了好几次都报错,说参数缺失。我明明在 Body 里选了 x-www-form-urlencoded 并填了 username 和 password 啊?
前端页面里的表单大概是这样的:
<form action="/login" method="post">
<input type="text" name="username" value="testuser" />
<input type="password" name="password" value="123456" />
<button type="submit">登录</button>
</form>
Postman 里是不是还要额外设置什么?还是我哪里理解错了?
先看你的 HTML 代码,input 标签的 name 属性是
username和password。你在 Postman 的 Body 里选了 x-www-form-urlencoded 之后,Key 这一栏填的必须跟 name 属性一模一样,少个字母或者大小写不对都不行。有些后端框架对参数名特别敏感,比如你 Key 写成了 user 或者 name,后端收到的就是 null。另外一个特别常见的问题是 Header 设置。Postman 很智能,你选了 Body 类型后,它会自动在 Headers 里帮你加上
Content-Type: application/x-www-form-urlencoded。这时候你千万别去 Headers 标签页里手动再添加一遍这个 Content-Type。如果你手动加了,Postman 可能会优先用手动设置的,导致格式冲突,后端解析出来就是空的。你去 Headers 那个标签页检查一下,如果有 Content-Type 这一行,直接删掉,让 Postman 自动处理就行。如果上面都对了还是不行,那可能是后端有 CSRF 防护,需要传个 token,不过看你给的 HTML 里没这个字段,先不管它。
试试按下面这样设置:
在 Postman 左侧选 Body,勾选 x-www-form-urlencoded。
Key 填
username,Value 填 testuser。Key 填
password,Value 填 123456。切换到 Headers 标签页,确保没有 Content-Type 这一行(如果有就删掉)。
这样一般就能通了。如果还不行,建议用浏览器的 F12 抓个包看看浏览器实际发出去的数据长啥样,对比一下 Postman 发的。