2013-06-29 8 views
8

के साथ विफल रहता है मेरे पास जर्सी बैकएंड एप्लिकेशन के साथ एंगुलरजेएस वेबप्लिकेशंस है।एंगुलरजेएस और जर्सी रीस्ट डिलीट ऑपरेशन 415 स्टेटस कोड

अब सब कुछ AngularJS से REST संसाधन तक पहुंचने के लिए ngResource का उपयोग करके ठीक काम कर रहा है। एकमात्र समस्या 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); 
} 

निम्नलिखित यूआरएल को कोणीय से बुलाया जाता है:

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

यह ठीक है (मेरे बाद)। अगर मैं इस यूआरएल को कर्ल से कॉल करता हूं, तो मुझे बैकएंड से ssystem.out को कंसोल पर पोस्ट किया जाता है।

क्लाइंट एप्लिकेशन में (AngularJS) मैं ब्राउज़र कंसोल पर निम्न अपवाद प्राप्त करें:

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

किसी को भी एक विचार है कि समस्या क्या हो सकता है? पोस्ट + जीईटी ठीक काम कर रहे हैं।

मैं निम्नलिखित है उपभोग/एनोटेशन का उत्पादन:

@Consumes({ MediaType.APPLICATION_JSON }) 

@Produces ({MediaType.APPLICATION_JSON})

आपकी मदद के लिए अग्रिम धन्यवाद।

स्वागत करती है मार्क


संपादित करें:

मैं $ http साथ AngularJS से बाहर बाकी सेवाओं तक पहुँचने के रास्ते को बदलने के लिए कोशिश की है।

अब मेरी सेवा के रूप में नीचे दिखता है:

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) 

प्राप्त करता है।

आपकी मदद के लिए धन्यवाद मार्क

उत्तर

0

मैं एक ही मुद्दा था, अपने हटाना विधि में कोर्स वस्तु का नया उदाहरण लौटने का प्रयास करें।

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

मैं भी इस में आए, समस्या हमेशा कोणीय है सामग्री प्रकार शीर्ष लेख हटाएं अनुरोध और जर्सी एक त्रुटि चक होगा पर XML करने के लिए सेट के रूप में आप निर्दिष्ट किया है कि अपने एपीआई की खपत/एनोटेशन के साथ 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']; 
    } 

और इससे छुटकारा पाएं। मुझे स्रोत संपादित किए बिना ऐसा करने का कोई तरीका नहीं पता। शायद बेहतर जेएस के साथ कोई जानता है कि कैसे, एर्म, जानता है कि कैसे।


वैकल्पिक रूप से, सर्वर साइड से, आप के रूप में रोब ने सुझाव दिया है (बजाय $ http की) करते हैं और लेने वाली 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

एक अन्य विकल्प लेने वाली MediaType.APPLICATION_XML अनुमति देने के लिए JAX-आरएस जर्सी पक्ष को बदलने के लिए है ... @ कंस्यूम्स ({MediaType.APPLICATION_JSON,, MediaType.APPLICATION_XML})। –

+0

अच्छा बिंदु, – paullth

+0

उत्तर देने के लिए जोड़ा गया ".config (function ($ httpProvider) ..." कहां रखा जाए? –

0

AngularJS $ संसाधन का उपयोग करते हुए अनुमति देने के लिए जर्सी विन्यास बदल सकते हैं, अनुरोध में "पेलोड" के बिना, सामग्री-प्रकार को पाठ/सादा के रूप में सेट किया गया है।

तो IMHO यह सर्वर पक्ष समर्थन बेहतर है। "Postel's Law कहा गया है कि आप क्या स्वीकार में उदार और आप क्या भेजने में रूढ़िवादी होना चाहिए -। source"

@DELETE 
@Path("{id}") 
@Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN }) 
public void remove(@PathParam("id") Long id) { ... 
संबंधित मुद्दे