2013-06-29 28 views
8

Tôi có một ứng dụng web AngularJS với một ứng dụng Backend Jersey.AngularJS và Jersey REST DELETE hoạt động thất bại với 415 Mã trạng thái

Bây giờ mọi thứ đều hoạt động tốt khi sử dụng ngResource để truy cập tài nguyên REST khỏi AngularJS. Vấn đề duy nhất là với tùy chọn DELETE.

Tôi có đoạn code sau để xóa một khóa học sử dụng ngResource tôi:

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

Trong backend (Jersey) Tôi có đoạn mã sau:

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

Nếu tôi cố gắng xóa một mục url sau đây được gọi từ Angular:

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

Điều này là tốt (sau tôi). Nếu tôi gọi url này từ CURL, tôi nhận được ssystem.out từ Backend được đăng lên bàn điều khiển.

Trong client-ứng dụng (AngularJS) tôi nhận được ngoại lệ sau trên trình duyệt giao diện điều khiển:

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

Bất cứ một ý tưởng những gì các vấn đề có thể được? POST + GET đang hoạt động tốt.

Tôi đã sau tiêu thụ/sản xuất chú thích:

@Consumes({ MediaType.APPLICATION_JSON }) 

@Produces ({MediaType.APPLICATION_JSON})

Cảm ơn trước sự giúp đỡ của bạn.

Greets Marc


EDIT:

Tôi đã cố gắng để thay thế cho cách truy cập vào các dịch vụ REST ra khỏi AngularJS với $ http.

Bây giờ dịch vụ của tôi trông như sau:

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, {}); 
    } 
}; 

}]);

Kết quả vẫn như cũ. Ứng dụng gọi ví dụ

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

và nhận được một

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

Nếu tôi gọi là cuộc gọi DELETE cùng trên Curl, mọi thứ đều hoạt động tốt.

Nhờ sự giúp đỡ của bạn Marc

Trả lời

0

tôi đã cùng một vấn đề, Hãy thử trở lại thể hiện mới của đối tượng học trong phương pháp xóa của bạn.

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

tôi tình cờ này là tốt, vấn đề là góc luôn đặt tiêu đề Content-Type để xml trên yêu cầu DELETE và jersey sẽ chuck một lỗi khi bạn đã xác định rằng api của bạn tiêu thụ/sản xuất JSON với các chú thích .

Vì vậy, để khắc phục nó (từ phía khách hàng), đặt tiêu đề content-type, ví dụ:

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

Tuy nhiên, vì lý do tôi không hiểu/không biết, góc cạnh sẽ tước đi những trang nội dung gõ tiêu đề từ yêu cầu nếu nó không có dữ liệu. Điều này sẽ có ý nghĩa nếu nó không phải là thực tế là các trình duyệt (chrome ít nhất) sẽ luôn luôn gửi một loại nội dung ... Dù sao bạn sẽ phải đi đến những rắc rối của việc tìm kiếm này trong nguồn góc:

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

và loại bỏ nó. Tôi không biết một cách để làm điều này mà không cần chỉnh sửa nguồn. Có thể ai đó có hiểu biết JS tốt hơn, erm, biết làm thế nào.


Ngoài ra, từ phía máy chủ, bạn có thể làm như Rob đã gợi ý và thay đổi cấu hình Jersey cho phép tiêu thụ 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

Một lựa chọn khác là thay đổi bên JAX-RS Jersey cho phép tiêu thụ MediaType.APPLICATION_XML ... @Consumes ({MediaType.APPLICATION_JSON,, MediaType.APPLICATION_XML}). –

+0

điểm tốt, được thêm vào để trả lời – paullth

+0

Vị trí đặt ".config (function ($ httpProvider) ..."? –

0

Sử dụng angularjs tài nguyên $ (thay vì $ http), mà không có "tải trọng" trong yêu cầu, loại nội dung được giải quyết dưới dạng văn bản/đồng bằng.

Vì vậy, IMHO hỗ trợ phía máy chủ tốt hơn. "Postel's Law tiểu bang mà bạn nên tự do trong những gì bạn chấp nhận và bảo thủ trong những gì bạn gửi -. source"

@DELETE 
@Path("{id}") 
@Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) 
public void remove(@PathParam("id") Long id) { ... 
Các vấn đề liên quan