邮递员表单数据和 x-www-form-urlencoded 工作,但原始 json 没有

Posted

技术标签:

【中文标题】邮递员表单数据和 x-www-form-urlencoded 工作,但原始 json 没有【英文标题】:Postman form-data and x-www-form-urlencoded work but raw json doesn't 【发布时间】:2021-02-01 08:47:45 【问题描述】:

我有一个将凭据发送到端点进行身份验证的表单,它应该返回一个令牌。我想用 javascript 替换 html 表单,但我无法让它工作。为了找出它为什么不起作用,我尝试对 Postman 做同样的事情,我得到的结果是,当我发送带有正文作为表单数据的 POST 请求时,它工作正常。将它作为 x-www-form-urlencoded 发送也可以,但是当我将它作为 json (Content-Type: "application/json") 发送时它不会。

请求JSON数据:


    "username": "my_username",
    "password": "my_password",
    "referer": "http://127.0.0.1:5500",
    "f": "json"

my_password 包含字母、点和下划线,但不包含其他特殊字符。我的密码只有一个感叹号作为特殊字符。

端点能否区分正在发送的表单或 javascript(获取 API)?另外,发送json而不是其他两个选项时,端点无法工作是否有任何原因?

【问题讨论】:

【参考方案1】:

端点能否区分正在发送的表单或 javascript(获取 API)?

不是。

如果是跨域请求,那么 JS 会添加一个Origin 标头。

客户端代码也可以显式地添加不同的标头。

在发送 json 而不是其他两个选项时,端点无法工作有什么原因吗?

如果端点不是为解析 JSON 格式的请求而设计的。


听起来你把事情复杂化了。

只需编写您的 JS 代码,使用 application/x-www-form-urlencodedmultipart/form-data(因为它们支持的格式)而不是 JSON 来发出 POST 请求。

您也可以重写端点以支持 JSON。

【讨论】:

感谢 Quentin,后端似乎不支持 json。使用 application/x-www-form-urlencoded 发送它是有效的。

以上是关于邮递员表单数据和 x-www-form-urlencoded 工作,但原始 json 没有的主要内容,如果未能解决你的问题,请参考以下文章

发布邮递员表单数据时请求正文为空

邮递员原始数据有效,但表单数据不适用于节点中的 POST 请求

邮递员表单数据发送带有文件的复杂对象

在邮递员中使用表单数据使 req.body 为空

无法通过邮递员 put 请求提交表单数据

邮递员多部分/表单数据错误:缺少开始边界