#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);
} );