Laravel响应JSON在真实响应后添加空花括号

时间:2018-08-16 14:13:46

标签: php laravel laravel-5.2

我要在路由未直接调用的函数中发送json响应,因此我添加了send()函数,如下所示:

return response()->json([
    'key' => 'value'
], 400)->send();

这会在浏览器中导致以下响应:

{"key":"value"}{}

这些空的花括号从哪里来?我如何摆脱它们,因为这会导致前端无法识别真正的响应。

出于这个问题,简化的代码如下所示:

routes.php

Route::post('/validate', 'ValidationController@validate');

ValidationController.php

public function validate(Request $request) 
{
    // Does some validation

    $this->saveData($request);
}

private function saveData(Request $request)
{
    // saves the data

    try {
        // Tries something
    } catch (\Throwable $exception) {
        return response()->json([
            'key' => 'value'
        ], 400)->send();
    }

    // saves the data
}

2 个答案:

答案 0 :(得分:2)

响应中的

send()不一定会阻止代码进一步运行。它只是将响应写入OB。 Controller中没有任何东西可以阻止进一步执行(就像return那样)。实际上,它仅在FastCGI env中这样做,因为它在内部调用fastcgi_finish_request

如果您使用Apache,那么您的问题很容易重现:

response(['test' => 'testdata'])->send();
return response()->json(null);
// --> {"test":"testdata"}{}

幸运的是,还有throwResponse()助手。如果您使用它而不是send() ,它将把响应作为{{1 }},从而阻止进一步的代码执行(->可能将其他响应写入OB /输出)。


更多见解:

我只是在您的控制器中猜到了您最后写了HttpResponseException的位置,您有某种// saves the data返回了一个return值。

天真的解决方案是:

    在您的null之后
  • exit-真的很丑
  • send()对控制器的响应,检查方法return之类的返回值,然后进一步返回

instanceof Response确实很有帮助/便利,而不是此类解决方案。

答案 1 :(得分:0)

return response([ 'key' => 'value' ], 400)->send(); 将对象和数组自动变形为json。您只需要这样做:

{{1}}

请参阅:https://github.com/laravel/framework/blob/5.2/src/Illuminate/Http/Response.php#L43