使用form-data发送POST请求正常,但等效raw JSON请求失败求助
这种情况我在开发中碰到过好多次,大概率是以下几个容易忽略的点导致的,你可以逐个排查:
请求头
Content-Type未正确设置
发送raw JSON格式请求时,必须在请求头里明确设置Content-Type: application/json。很多API测试工具(比如Postman)在选择raw JSON模式时会自动帮你加上这个头,但如果是自己写代码调用或者用其他工具,很容易漏掉这一步。服务器收到请求后,会根据这个头来判断如何解析请求体,如果没设置,它可能还是按照form-data的方式去解析,自然读不到你的JSON参数。JSON格式存在语法错误
你说参数的键值对没问题,但可能是JSON的语法细节出错了——比如字符串用了单引号(JSON规范要求必须用双引号)、对象或数组末尾多了逗号、或者嵌套结构写错了。你可以把要发送的JSON内容复制到JSON校验工具里检查一下,确认没有语法问题。举个例子:{'username': 'asaf'}是无效的JSON,必须写成{"username": "asaf"}。服务器端未配置JSON解析支持
有些后端框架默认只处理form-data格式的请求,需要手动配置JSON解析的中间件或依赖才能处理JSON请求体。比如在Node.js的Express框架中,如果没添加express.json()中间件,服务器就无法解析JSON格式的请求;在Spring Boot项目里,如果缺少Jackson这类JSON处理依赖,也会出现无法解析JSON请求的情况。这种情况下,哪怕你的请求完全正确,服务器也读不到参数。参数类型或结构不匹配
虽然你传了3个参数,但可能服务器期望的是嵌套结构(比如把参数放在一个对象里),而你传的是平级的键值对;或者参数类型不符合要求——比如服务器需要的是数字类型的age,你传了字符串类型的"25"。form-data格式下服务器可能会自动做类型转换,但JSON是严格区分类型的,这就会导致解析失败。特殊字符未正确转义
如果参数里包含特殊字符(比如双引号、反斜杠、换行符),在JSON中必须进行转义处理,否则会破坏JSON的结构导致解析失败。而form-data格式通常不需要额外转义,这就会出现form-data正常但JSON请求失败的情况。比如要发送包含双引号的字符串He said "hello",在JSON里必须写成"He said \"hello\""。
内容的提问来源于stack exchange,提问作者Asaf

