Ответ Laravel JSON возвращает защищенные данные

#json #laravel

#json #laravel

Вопрос:

 return Response::json(array('status' => 'Group not found'));
  

возвращает защищенные данные. Вот JSON:

{"status":"Group not found"}

Следующий код

 //$jsonData - the data returned above

var_dump($jsonData);
  

возвращает это:

объект (Illuminate Http JsonResponse)#320 (10) { [«jsonOptions»:protected]=> int(0) [«data»:protected]=> строка (28) «{«статус»: «Группа не найдена»}» [«обратный вызов»: защищен]=> NULL [«encodingOptions»:protected]=> int(15) [«headers»]=> object(Symfony Component HttpFoundation ResponseHeaderBag)#317 (5) { [«computedCacheControl»:protected]=> array(1) { [«no-cache»]=> bool(true) } [«cookies»: защищено]=> массив (0) { } [«Имена заголовков»: защищено]=> массив (3) { [«cache-control»]=> строка (13) «Cache-Control» [«content-type»]=> строка (12) «Тип содержимого» [«дата»]=> строка (4) «Дата» } [«заголовки»: защищенный]=> массив (3) { [«контроль кэша»]=> массив (1) {[0]=>строка (8) «без кэша» } [«тип содержимого»]=> массив (1) {[0]=> строка (16) «приложение / json» } [«дата»]=> массив (1) {[0]=> строка (29)»Вт, 17 июня 2014 19:03:33 GMT» } } [«CacheControl»: защищенный]=> массив (0) { } } [«содержимое»: защищенный]=> строка (28) «{«статус»:»Группа не найдена»}» [«версия»: защищенный] => строка (3) «1.0» [«StatusCode»: защищенный]=> int(200) [«statusText»: защищенный]=> строка (2) «OK» [«charset»: защищенный] => NULL }

Взгляните на ["data":protected]=> string(28) "{"status":"Group not found"}" . Данные по какой-то причине защищены и не отображаются при декодировании JSON. Как мне «снять защиту» с него (сделать его общедоступным)?

Комментарии:

1. У меня точно такая же проблема с приложением Laravel, как и у вас. Как сказал мой коллега, фреймворки упрощают и усложняют сложные вещи

2. Столкнувшись с той же проблемой, есть ли у вас какое-либо решение по этому поводу?

Ответ №1:

Я не думаю, что это ваша проблема.

Если вы посмотрите на дерево наследования:

 SymfonyComponentHttpFoundationResponse
    SymfonyComponentHttpFoundationJsonResponse
        IlluminateHttpJsonResponse
  

Класс ответа-предка имеет:

 public function __toString()
{
    ...
    return ... . $this->getContent();
}
  

Итак, мы следуем:

 public function getContent()
{
    return $this->content;
}
  

Это нормально, что ваши данные хранятся внутри member protected $content , потому что, когда объект JsonResponse преобразуется в строку, PHP использует возвращаемое значение __toString() метода в качестве строкового представления этого объекта.

Комментарии:

1. Это все еще не объясняет, почему использование json_encode вместо Response::json работы. Последний скрывает данные под protected атрибутом, и я не могу получить к нему доступ позже при декодировании строки JSON с помощью json_decode .

2. Я все еще думаю, что это не проблема. Зачем вам нужно json_decode на сервере после того, как вы передали его в Response::json (который должен быть оператором return в конце действия вашего маршрутизатора / контроллера)?

3. json_encode — это функция. он принимает смешанное и возвращаемое значение представляет собой строку, которая является представлением входных данных в формате JSON. Response::json возвращает объект, который вы должны вернуть в качестве возвращаемого значения вашего маршрута / действия. Разница между json_encode и Response::json заключается в различии между деталями реализации функции и объекта ООП.

4. Я разрабатываю API для мобильных устройств. Метод возвращает данные в форме JSON, но иногда я хочу использовать тот же метод для веб-приложения, поэтому мне нужно сначала декодировать данные JSON.

5. Хорошо, хорошо. json_encode предназначен для случаев, когда вы хотите закодировать данные в JSON. Ответ::json(…) предназначен для случаев, когда вы хотите отправить данные клиенту, установить правильные заголовки, закодировать данные в формате JSON, а затем записать их в выходной буфер. Вот ваш ответ. Ваш API должен использовать json_encode, если он не возвращает JSON клиенту браузера… в этом случае следует использовать Response::json