Статус 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 не соблюдал переадресацию.

Слово мудрому.