Laravel response json добавляет пустые фигурные скобки после реального ответа

Я отправляю ответ 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
}

попробуй без ->send()

Hussein 16.08.2018 16:25

@Hussein это приводит к игнорированию оператора return.

jrenk 16.08.2018 16:28

попробуйте это: $res = ['key' => 'value']; return response()->json($res);

Hussein 16.08.2018 16:30

@ Хусейну тоже не повезло.

jrenk 16.08.2018 16:32

вы можете разместить свой код контроллера?

Hussein 16.08.2018 16:33

Может ли {} поступить откуда-нибудь?

Niraj Shah 16.08.2018 16:35

@jrenk Метод send отсутствует в de документация Я думаю, у вашей проблемы другое происхождение.

Douwe de Haan 16.08.2018 16:48

похоже, что {} исходит от вашей функции validate() в вашем ValidationController, вы можете добавить больше кодов для функции validate()? мы не можем воспроизвести вашу проблему, так как ваш код сейчас работает на моей стороне.

Dexter Bengil 16.08.2018 17:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
8
469
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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() необходима для отправки заголовков и содержимого.

Dexter Bengil 16.08.2018 17:48
Ответ принят как подходящий

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 оказывается действительно полезным / удобным вместо подобных решений.

очень хорошо сказано :)

Dexter Bengil 16.08.2018 18:11

Это решило проблему. Спасибо за очень хорошо написанный ответ.

jrenk 17.08.2018 08:30

Другие вопросы по теме