Нежелательная оболочка «данных» в PHP в ответ на запрос AngularJS

#php #json #angularjs #http-headers

#php #json #angularjs #http-заголовки

Вопрос:

Я запрашиваю некоторый сервер с помощью AngularJS, используя $http.get

 var onStuff = function(data) {
  console.log( "Stuff received: "   angular.toJson(data));
  $scope.stuff = data.data;
};

$http.get("https://some.server.net/stuff")
  .then(onStuff, onError);
  

Мой сервер написан на php и возвращает правильно отформатированный JSON.
Я проверил, что загрузка https://some.server.net/stuff в браузере и тестирование с помощью командной строки «php stuff.php » . Это выглядит примерно так (усечено с помощью … чтобы соответствовать этому экрану):

 [{"id":"1","user_id":"1","name":"Name1"},
 {"id":"2","user_id":"1","name":"Name2"},
 ...
]
  

Пожалуйста, обратите внимание, что эти данные «развернуты» или «просто массив»
Однако при onStuff() вызове мой массив «оборачивается» внутри другого data объекта

Вот вывод консоли

     Stuff received: 
    {"data":[{"id":"1","user_id":"1","name":"Name1"},
             {"id":"2","user_id":"1","name":"Name2"},...],
     "status":200,
     "config":{"method":"GET",
               "transformRequest":[null],
               "transformResponse":[null],
               "url":"https://some.server.net/stuff",
               "headers":{"Accept":"application/json, text/plain, */*"}},
     "statusText":"OK"} 
  

Вот материал php

 <?
header('content-type: application/json; charset=utf-8');
header("access-control-allow-origin: *");

require_once("stuff.class.php");

$mysqli = new mysqli( "localhost", "user", "password", "database");
$list = Stuff::getList( $mysqli);
echo json_encode( $list);
$mysqli->close();
 ?>
  

Я следовал руководству по использованию github api, ответ JSON был доступен непосредственно в data
Я почти уверен, что это связано с заголовками HTTP, но я надеялся, content-type что об этом позаботятся

Что я должен сделать, чтобы удалить нежелательную оболочку «data»?

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

1. Отклоняя вопросы для голосования, тщательно разработанные с учетом подлинных исследовательских усилий, вы превращаетесь в абсолютное дерьмо. Просто говорю.

Ответ №1:

Вместо использования универсального promise API (который, похоже, возвращает объект со всем, что внутри), используйте success и error методы, предоставляемые $http :

 var onStuff = function(data) {
  console.log( "Stuff received: "   angular.toJson(data));
  $scope.stuff = data.data;
};

$http.get("https://some.server.net/stuff")
  .success(onStuff).error(onError);
  

Это должно предоставить вам данные в ожидаемом формате. Полный API выглядит следующим образом:

   $http({method: 'GET', url: '/someUrl'}).
    success(function(data, status, headers, config) {
      // this callback will be called asynchronously
      // when the response is available
    }).
    error(function(data, status, headers, config) {
      // called asynchronously if an error occurs
      // or server returns response with an error status.
    });
  

Ответ №2:

Кажется, что вы ожидаете onStuff получать только десериализованные данные JSON, но это не то, что делает API. Объект, передаваемый вашему $http.get(...).then() обратному вызову (т.Е. onStuff ), является объектом ответа с пятью свойствами: data , status , headers , config и statusText — это именно то, что вы видите в выводе на консоль. data Свойство содержит десериализованные данные JSON, вот почему вы должны сделать $scope.stuff = data.data .

Если вы хотите onStuff получать только десериализованные данные JSON, вам придется вызывать их через посредника:

 $http.get("https://example.com/stuff")
  .then( function(response) {
           onStuff(response.data);
         } );