Я отправляю ответ 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
}
@Hussein это приводит к игнорированию оператора return.
попробуйте это: $res = ['key' => 'value']; return response()->json($res);
@ Хусейну тоже не повезло.
вы можете разместить свой код контроллера?
Может ли {} поступить откуда-нибудь?
@jrenk Метод send отсутствует в de документация Я думаю, у вашей проблемы другое происхождение.
похоже, что {} исходит от вашей функции validate() в вашем ValidationController, вы можете добавить больше кодов для функции validate()? мы не можем воспроизвести вашу проблему, так как ваш код сейчас работает на моей стороне.






response() автоматически преобразовывает объекты и массивы в json. Вам просто нужно сделать:
return response([
'key' => 'value'
], 400)->send();
См .: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Http/Response.php#L43
это не будет работать с функцией saveData OP, поскольку она не вызывается напрямую маршрутом, поэтому функция ->send() необходима для отправки заголовков и содержимого.
send() в ответе не обязательно мешает вашему коду работать дальше. Он просто пишет ответ в OB. В вашем контроллере нет ничего, что могло бы предотвратить дальнейшее выполнение (как это сделал бы return). Фактически, он делает это только в среде FastCGI, потому что вызывает fastcgi_finish_request изнутри.
Если вы используете Apache, ваша проблема легко воспроизводится:
response(['test' => 'testdata'])->send();
return response()->json(null);
// --> {"test":"testdata"}{}
К счастью, есть также помощник throwResponse(). Если вы используете используйте это вместо send(), он выдаст ответ как HttpResponseException и, таким образом, предотвратит дальнейшее выполнение кода (-> потенциально дополнительные ответы, записанные в OB / вывод).
Еще немного понимания:
Я только что догадался в вашем контроллере, где вы написали // saves the data, в итоге у вас есть какой-то return, который возвращает значение null.
Наивными решениями были бы:
exit после вашего send() - действительно некрасивоreturn ответ на ваш контроллер, проверьте возвращаемое значение вашего метода, например instanceof Response, и верните его дальше.throwResponse оказывается действительно полезным / удобным вместо подобных решений.
очень хорошо сказано :)
Это решило проблему. Спасибо за очень хорошо написанный ответ.
попробуй без
->send()