Spring Data/REST - Javascript (jquery, backbone) успокаивающие вызовы заканчиваются ответом 404

У меня есть пример приложения: https://github.com/LateralThoughts/orsyp-frontend-training/tree/master/zupr_trackr. Он предоставляет 3 объекта JPA (Компания, Сотрудник, Activity) через ресурсы REST, обрабатываемые Spring DATA/REST.

Хотя я могу успешно запросить REST API, например, через надстройку REST для браузера, следующий запрос (в том же или другом домене) всегда возвращает 404:

$.getJSON("http://localhost:8080/api/companies/")
    .success(function() { alert("success"); })
    .fail(function(event, jqxhr, exception) {
        console.log(jqxhr, exception);
    })
    .complete(function() { alert("Done"); }
);

Единственная разница, которую мы заметили при сравнении сгенерированного HTTP-запроса (через надстройку REST) ​​и запроса, управляемого jquery, — это отсутствие «Referer» в первом случае и его наличие в последнем.

Добавление этого заголовка с дополнительным интерфейсом REST приведет к сбою запроса, как описано ранее.

Приветствуются любые идеи, заранее спасибо

Рольф

P.S.: это верно для GET/POST и других глаголов.


person fbiville    schedule 14.04.2013    source источник
comment
Получаете ли вы какие-либо исключения на стороне Java? Есть ли более подробное сообщение об ошибке в ответе HTTP?   -  person Eric Levine    schedule 15.04.2013
comment
Это не последний трейлинг/случайно? случилось со мной раньше, вы никогда не знаете ...   -  person Eran Medan    schedule 15.04.2013
comment
Привет, спасибо за ваши ответы, речь идет не о завершающей косой черте, оба URL-адреса (с и без /) обслуживаются при переходе туда вручную. Я установлю уровень LOG на TRACE и посмотрю, смогу ли я обнаружить какой-либо стек.   -  person fbiville    schedule 15.04.2013


Ответы (1)


Spring Data REST не любит заголовки Accept, отправленные jQuery.

jQuery отправляет эти заголовки:

Accept:application/json, text/javascript, */*; q=0.01

И если вы попробуете такие запросы:

curl -v -XGET -H "Accept:application/json, text/javascript, */*; q=0.01" http://localhost:8080/api/employees/

он потерпит неудачу как 404, но если вы измените его, удалив часть text/javascript:

curl -v -XGET -H "Accept:application/json, */*; q=0.01" http://localhost:8080/api/employees/

этот работает.

Вы можете переопределить заголовки Accept по умолчанию, используемые jQuery, используя метод $.ajaxSetup, или вы можете просто переопределить эти настройки при запросе вашего API.

$.ajax({
    url : "http://localhost:8080/api/employees", 
    accepts: {json:'application/json'}
})

Теперь о почему, я думаю, что здесь есть проблема в Spring Data REST:

https://github.com/SpringSource/spring-data-rest/blob/master/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java#L46

где заголовок Accept совпадает, и я думаю, что это может быть связано с тем, что text/javascript не существует для SpringData REST.

person Olivier Girardot    schedule 16.04.2013