Laravel 5.4不会验证JSON

时间:2017-05-19 12:13:40

标签: json laravel-5.4 laravel-validation

我正在使用Laravel 5.4并尝试在我的POST请求中验证JSON但是验证器失败说明JSON不是有效的,即使它是。我假设我没有正确理解验证规则而我的实现是错误的,而不是错误或其他错误。

我有一个简单的POST端点,其AcceptContent-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"
]

1 个答案:

答案 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字符串作为一个键的唯一值。