Статус HTTP 0 от AngularJS Получить для JSON
Я запускаю $http.get для JSON и получаю статус 0. Я загрузил тот же JSON, и работа get работает локально, а в Python с использованием библиотеки запросов я могу получить JSON без проблем, но в AngularJS он не работает. Я не понимаю, почему angular не получает его, а все остальное. Ниже приведен фрагмент кода.
function AgentListCtrl($scope, $http) {
$http.get('http://foo.bar/api/objects').success(function(data) {
$scope.objects = data;
}).error(function(data, status) {
$scope.status1 = status;
});
Это обеспечивает JSON и анализирует его при использовании локального файла, но в противном случае он терпит неудачу и устанавливает статус1 в 0.
Ответы
Ответ 1
В вашем коде присвоение статуса происходит только при возникновении ошибки. Вы должны иметь возможность получить статус, когда вызов был успешно выполнен следующим образом:
success(function(data, status, headers, config) {
$scope.objects = data;
$scope.status1 = status;
}).error(function(data, status) {
$scope.status1 = status;
});
Ответ 2
Просто, чтобы понять это, поскольку прямо не указано в приведенном выше ответе (но в его комментариях), и, как и я, некоторые новички Angular могут потратить некоторое время на это:
-
Angular $resource сможет выполнить глагол REST на другом сервере, который, в свою очередь, будет правильно отвечать (с помощью status 200
). Angular, тем не менее, терпит неудачу с криптовальным сообщением, идентифицируемым по статусу 0. Это дополнительно вводит в заблуждение, поскольку в отладчике браузера вы можете увидеть ответ сервера.
-
Angular выполнит запрос OPTIONS
по запросу кросс-домена (по крайней мере, для метода по умолчанию query()
), если не указано иное. Обычно сервер не отвечает с нужным контентом (т.е. Вашим представлением). Один простой способ сделать это для каждого запроса - указать способ 'GET'
.
$resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
-
Сервер, отвечающий на ваши запросы REST, ДОЛЖЕН включать заголовки, указанные CORS [1], чтобы позволить Angular правильно использовать ответ. По существу это означает включение заголовка Access-Control-Allow-Origin
в ваш ответ, указывающий серверы, откуда приходит запрос, которые разрешены. Это значение может быть *
.
Дополняя этот ответ для тех, кто интегрирует AngularJS с spring -data-rest-webmvc:
-
Отформатированный отклик javascript от HATEOAS неправильно потребляется Angular, производя вместо этого ошибку Expected response to contain an array but got an object
. Это можно решить, добавив параметр isArray: false
в конфигурацию $resouce
;
-
очень точный пример настройки CORS для сценария spring -data-rest-webmvc представлен в [2] (см. SimpleCORSFilter
)
[1] https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS
[2] https://spring.io/guides/gs/rest-service-cors/
Ответ 3
У меня была аналогичная проблема. API-интерфейс сторонних разработчиков, который возвращает JSON просто отлично через все другие средства, терпел неудачу со статусом 0 при вызове через метод Angular $http.get().
В моем случае не было проблемы с CORS. Вместо этого URL, который я использовал для API, был не совсем правильным, и сервер выдавал 301 ответ. Angular не соблюдал переадресацию.
Слово мудрому.