2013-06-29 1 views
8

У меня есть приложение AngularJS с использованием приложения Back Back Back.УгловаяJS и Джерси REST DELETE операция не выполняется с 415 Код состояния

Теперь все работает нормально, используя ngResource для доступа к ресурсу REST из AngularJS. Единственная проблема заключается в опции DELETE.

У меня есть следующий код, чтобы удалить курс с помощью моего ngResource:

Course.deleteCourse = function(course) { 
    course.$remove({ 
     courseId:course.id 
    }); 
    return course; 
}; 

В бэкэнде (Джерси) У меня есть следующий код:

@DELETE 
@Path("{id}") 
public final void remove(@PathParam("id") final String id) { 
    System.out.println("DELETE ID = " + id); 
} 

Если я пытаюсь удалить элемент из Углового вызывается следующий url:

DELETE http://localhost:8080/manager-api/courses/5 

Это прекрасно (после меня). Если я назову этот url из CURL, я получаю ssystem.out из Backend, отправленного на консоль.

В клиент-приложение (AngularJS) я получаю следующее исключение на консоли браузера:

DELETE http://localhost:8080/manager-api/courses/5 415 (Unsupported Media Type) 

Любой идея, что может быть проблема? POST + GET работают нормально.

У меня есть следующие потреблять/производство аннотаций:

@Consumes({ MediaType.APPLICATION_JSON }) 

@Produces ({MediaType.APPLICATION_JSON})

Заранее спасибо за вашу помощь.

Greets MARC


EDIT:

Я попытался заменить путь доступа к REST услуг из AngularJS с $ HTTP.

Теперь моя служба выглядит, как показано ниже:

MyApp.factory("Course", ["$http", function ($http) { 
var courseBaseUrl = "/api/courses/"; 

return { 
    show: function show(courseId) { 
     return $http.get(courseBaseUrl + courseId); 
    }, 
    list: function list() { 
     return $http.get(courseBaseUrl, {}); 
    }, 
    remove: function remove(courseId) { 
     return $http.delete(courseBaseUrl + courseId, {}); 
    }, 
    save: function save(course) { 
     return $http.post(courseBaseUrl, course, {}); 
    } 
}; 

}]);

Результат все тот же. Приложение вызывает например

DELETE http://localhost:8080/manager-api/courses/1 

и получает

DELETE http://localhost:8080/manager-api/courses/1 415 (Unsupported Media Type) 

Если я вызываю же УДАЛИТЬ вызов на Curl, все работает отлично.

Спасибо за вашу помощь Марк

ответ

0

я была такая же проблема, попробуйте возвращение новый экземпляр объекта курса в вашем методе удаления.

@DELETE 
@Path("{id}") 
public final Course remove(@PathParam("id") final String id) { 
    System.out.println("DELETE ID = " + id); 
    return new Course(); 
} 
11

Я наткнулся на это так же, проблема Угловая всегда устанавливает Content-Type заголовок XML на DELETE запросов и джерси будет Chuck об ошибке, как вы указали, что ваша апи потребляет/производит JSON с аннотациями ,

Так, чтобы исправить это (со стороны клиента), установите заголовок типа содержимого, например:

.config(function($httpProvider) { 
    /** 
    * make delete type json 
    */ 
    $httpProvider.defaults.headers["delete"] = { 
    'Content-Type': 'application/json;charset=utf-8' 
    }; 
}) 

Однако, по причинам, которые я не понимаю/не знаю о, угловой будет стирают контент- введите заголовок типа из запроса, если он не имеет данных. Это имело бы смысл, если бы не тот факт, что браузеры (по крайней мере, хром) всегда будут отправлять контент-тип ... В любом случае вам придется обратиться к проблеме поиска этого в угловом источнике:

// strip content-type if data is undefined 
    if (isUndefined(config.data)) { 
    delete reqHeaders['Content-Type']; 
    } 

и избавиться от него. Я не знаю, как это сделать без редактирования источника. Может быть, кто-то с лучшим ноу-хау JS, erm, знает как.


С другой стороны, на стороне сервера, вы можете сделать, как Роб предложил изменить конфигурацию Джерси, чтобы позволить потребляя MediaType.APPLICATION_XML

@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
public final void remove(@PathParam("id") final String id) { 
    System.out.println("DELETE ID = " + id); 
} 
+1

Другой вариант заключается в изменении в сторону JAX-RS-Джерси, чтобы потреблять MediaType.APPLICATION_XML ... @Consumes ({MediaType.APPLICATION_JSON,, MediaType.APPLICATION_XML}). –

+0

хорошая точка, добавлено в ответ – paullth

+0

Где поставить «.config (function ($ httpProvider) ...»? –

0

Использование angularjs $ ресурса (вместо $ HTTP), без «полезной нагрузки» в запросе тип контента устанавливается как текстовый/обычный.

Так что ИМХО лучше поддерживать серверную сторону. «Postel's Law говорится, что вы должны быть либералом в том, что вы принимаете и консервативны в том, что вы отправляете -. source»

@DELETE 
@Path("{id}") 
@Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) 
public void remove(@PathParam("id") Long id) { ... 
Смежные вопросы