2014-02-19 2 views
0

Я пытаюсь использовать webservice на своей локальной машине и использовать AngularJS $ http. Через браузер все работает нормально, и я получаю правильный ответ JSON. Но с AngularJS $ http Я получаю ошибку 404, однако, обработчик найден и генерируется ответ.Spring RESTfull Web Service + AngularJS HTTP 404 error

FrontEnd:

$http.get('http://localhost:8080/apartments.json'). 
      success(function(data){ 
       $scope.apartments = data; 
      }). 
      error(function(data, status){ 
       alert("Error "+ status); 
      }); 

BackEnd:

@Controller 
public class ApartmentsController { 

    @RequestMapping(value = "/apartments", method = RequestMethod.GET) 
    public @ResponseBody List<ApartmentEntity> getAll(){ 
     ApartmentEntity apartmentEntity = new ApartmentEntity(); 
     apartmentEntity.setName("test"); 
     apartmentEntity.setPrice(1000); 
     return Arrays.asList(apartmentEntity); 
    } 
} 

Servlet отображается правильно.

Не могли бы вы предложить, что не так?

+0

Где вы обслуживаете угловой файл html? –

+0

Это отдельный веб-сервер на той же машине. – shevchyk

+0

Не связано CORS? – kubuntu

ответ

1

Проблема заключается в том, что по умолчанию Угловая пытается использовать CORS, так как это попытка запроса ajax с одной страницы, загруженной с одного сервера на службу REST, запущенной на другом сервере.

Способ, которым он пытается использовать CORS, заключается в выдаче GET с заголовком по умолчанию, который запускает браузер для запроса «перед полетом» OPTIONS.

Этот предполетный автоматический запрос OPTIONS предназначен для того, чтобы браузер получил список поддерживаемых методов сервером, и это первый шаг CORS.

Таким образом, 404 исходит из этого запроса OPTIONS.

См. Это issue в Angular, кажется, что это было исправлено в более поздних версиях, так как это вызывало множество вопросов от пользователей. См. Также original issue, который вызвал исправление.

В вашем случае для локальной разработки вы всегда можете развернуть оба приложения на одном сервере, и проблема решена.

Если в производстве необходимо запустить интерфейс/бэкэнд на отдельных серверах, то либо прокси-сервер этих серверов с помощью общего интерфейса сервера, например nginx/Apache, либо или включить CORS, см. enable-cors.org.

+0

Спасибо за объяснение, где ошибка 404 исходит от – shevchyk

+0

@shevchik. Альтернативный подход к включению CORS (который может быть не всегда возможен [не говоря ни слова с технической точки зрения]) - проксировать ваши запросы. То есть все запросы конечной точки RESTful могут быть перенаправлены вашим собственным сервером веб-приложений на соответствующий сервер конечных точек RESTful. Поскольку серверная сторона не подпадает под CORS. –