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 里是不是还要额外设置什么?还是我哪里理解错了?
首先确认一下:你是在 Body 标签页里选了 x-www-form-urlencoded 之后,下面的输入框里填的 key-value 吧?Postman 这儿有个容易忽略的地方——你填完 key 和 value 之后要点右边的 "Add" 按钮或者按回车键添加进去,光填完没添加是不行的。添加成功后上面会显示一个 key-value 列表。
然后检查一下后端收参的名称对不对,username 和 password 这两个字段名是否完全匹配(包括大小写)。
如果你确定以上都没问题,可以用 Postman 的控制台看一下实际发送的请求。点左下角那个 Console 按钮,打开后发送请求,能看到实际发的请求头和请求体。确认 Content-Type 确实是 application/x-www-form-urlencoded,且 body 里的数据是 username=testuser&password=123456 这种格式。
还有个偏门招:如果服务端用的是某些框架的特定写法,可能需要确认下是否需要额外传 Content-Length 头,不过这个一般 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 发的。