使用Postman调用Laravel API时JSON验证失败问题
解决Laravel中body字段JSON验证失败的问题
看起来你遇到的问题是因为Laravel自动解析了JSON请求体,导致你的验证规则和实际接收的数据类型不匹配,我来一步步帮你解决:
问题根源
当你在Postman中发送Content-Type: application/json的POST请求时,Laravel会自动将请求体的JSON字符串解析成PHP数组/对象。而你的验证规则里要求body是JSON字符串,但此时$request->body已经是解析后的数组了,自然会触发"The body must be a valid JSON string."的错误。
解决方案(分两种场景)
场景1:你实际需要验证body的数组结构(推荐)
从你的请求内容来看,body是一个包含不同类型区块的数组,这才是你真正需要验证的结构。把原来的json规则改成数组验证,并细化内部字段的规则:
$validator = Validator::make($request->all(), [ 'title' => 'required|string|max:255', 'body' => 'required|array', // 验证body数组中每个元素的基础规则 'body.*.type' => 'required|string|in:paragraph,header,list', 'body.*.data' => 'required|array', // 针对不同type的data做针对性验证 'body.*.data.text' => 'required_if:body.*.type,paragraph,header|string', 'body.*.data.level' => 'required_if:body.*.type,header|integer|between:1,6', 'body.*.data.style' => 'required_if:body.*.type,list|string|in:ordered,unordered', 'body.*.data.items' => 'required_if:body.*.type,list|array', 'body.*.data.items.*' => 'string', 'status' => 'required|boolean' ]);
这样既符合你的业务需求,又能准确验证body的结构合法性。
场景2:你确实需要接收原始的JSON字符串
如果你因为某些原因必须让body是原始的JSON字符串(比如前端是直接把JSON.stringify后的字符串作为body的值发送),那需要调整两个地方:
- Postman发送方式:把请求体的
body字段值改成JSON字符串格式(注意要转义引号),比如:{ "title": "abc", "body": "[{\"type\":\"paragraph\",\"data\":{\"text\":\"aSADAd\"}}, {\"type\":\"header\",\"data\":{\"text\":\"Heading......\",\"level\":2}}, {\"type\":\"paragraph\",\"data\":{\"text\":\"This is a para\"}}, {\"type\":\"list\",\"data\":{\"style\":\"ordered\",\"items\":[\"ABC\",\"XYZ\"]}}]", "status": 1 } - Laravel验证:保持原来的
json规则即可,此时$request->body会是原始的JSON字符串,验证就能通过。
验证测试
修改规则后,在Postman中确保:
- 请求的
Content-Type头设置为application/json - 请求体是你最初提供的JSON结构(不需要转义)
发送请求后,验证应该就能正常通过了。
内容的提问来源于stack exchange,提问作者Debarshi Das
相关产品推荐
相关产品推荐

