我正在使用Laravel 5.4并尝试在我的POST请求中验证JSON但是验证器失败说明JSON不是有效的,即使它是。我假设我没有正确理解验证规则而我的实现是错误的,而不是错误或其他错误。
我有一个简单的POST端点,其Accept
和Content-Type
标头都设置为application/json
。
在我的POST请求中(使用Postman进行测试)我提供了RAW数据。
{
"only_this_key": { "one": "two" }
}
在我的控制器方法中,我有以下内容:
// I'm using intersect to remove any other parameters that may have been supplied as this endpoint only requires one
$requestData = $request->intersect(['only_this_key']);
$messages = [
'only_this_key.required' => 'The :attribute is required',
'only_this_key.json' => 'The :attribute field must be valid JSON',
];
$validator = \Validator::make($requestData, [
'only_this_key' => 'required|json',
], $messages);
if ($validator->fails()) {
return new APIErrorValidationResponse($request, $validator);
}
return response()->json(['all good' => 'here']);
我收到的错误是 库存字段必须是有效的JSON ,即使它是!
使用Postman传递原始数据
{
"only-this-key": {
"item-one": "one",
"item-two": "two",
"item-three": "three"
},
"not": "wanted"
}
当我在方法
中使用dd($request->all());
时
array:2 [
"what-i-want" => array:3 [
"item-one" => "one"
"item-two" => "two"
"item-three" => "three"
]
"not" => "wanted"
]
答案 0 :(得分:0)
问题在于Laravel如何解释请求中的原始数据。如果您在控制器中运行dd($request->all())
,您将看到此输出:
array:1 [
"{"only_this_key":{"one":"two"}}" => ""
]
您的整个JSON字符串被设置为一个值为空字符串的键。如果您绝对必须将其作为原始数据发送,那么您将必须获取该键值并将其保存到具有所需键的数组中。这应该有效(而不是intersect
行)。
$requestData = ['only_this_key' => key($request->all())];
或者,您可以将正文作为x-www-form-urlencoded
发送,并将整个JSON字符串作为一个键的唯一值。