2012-04-05 17 views
5

मेरे पास एक आराम सेवा के लिए एक साधारण jquery AJAX कॉल है। मैं सामग्री को "एप्लिकेशन/जेसन" के रूप में टाइप कर रहा हूं और बाकी संसाधन को "MediaType.APPLICATION_JSON" स्वीकार करने के लिए कॉन्फ़िगर किया गया है। यह एक पोस्ट विधि है। इस सेटअप के साथ, मुझे "असमर्थित मीडिया प्रकार" त्रुटि मिल रही है।jquery AJAX आराम कॉल - असमर्थित मीडिया प्रकार

हैडर जानकारी "सामग्री प्रकार आवेदन/json; charset = UTF-8" से पता चलता अनुरोध हेडर में

रिस्पांस पता चलता है: स्थिति रिपोर्ट: असमर्थित मीडिया प्रकार सर्वर इस अनुरोध से इनकार कर दिया क्योंकि अनुरोध इकाई एक प्रारूप में है जो अनुरोधित विधि (असमर्थित मीडिया प्रकार) के लिए अनुरोधित संसाधन द्वारा समर्थित नहीं है।

कृपया इस समस्या को हल करने के लिए कुछ पॉइंटर्स प्रदान करें।

यहाँ कोड का टुकड़ा है:

बाकी संसाधन

@POST 
@Produces({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML}) 
@Consumes({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML}) 
public Response addPerson(MyJSONObj myObj) { 
    //... 
    // ... 
    //... 
} 

jQuery

$(document).ready(function() { /* put your stuff here */ 
    $("#Button_save").click(function(){ 
    var firstName = $('firstName').val(); 
    var lastName = $('lastName').val(); 
    var person = {firstName: firstName, lastName: lastName}; 
    $.ajax({ 

     url:'http://localhost:8080/sampleApplication/resources/personRestService/', 
     type: 'POST', 
     data: person, 
     Accept : "application/json", 
     contentType: "application/json", 

     success:function(res){ 
     alert("it works!"); 
     }, 
     error:function(res){ 
      alert("Bad thing happend! " + res.statusText); 
     } 
    }); 
    }); 
}); 

हेडर एफएफ Firebug में

दिखाया गया के रूप में

प्रतिक्रिया हेडर

Content-Length 1117 
Content-Type text/html;charset=utf-8 
Date Thu, 05 Apr 2012 09:44:45 GMT 
Server Apache-Coyote/1.1 

अनुरोध हेडर

Accept */* 
Accept-Encoding gzip, deflate 
Accept-Language en-us,en;q=0.5 
Connection keep-alive 
Content-Length 97 
Content-Type application/json; charset=UTF-8 
Host localhost:8080 
Referer http://localhost:8080/sampleApplication/ 
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0 
X-Requested-With XMLHttpRequest 

उत्तर

0

ऐसा लगता है कि एक टपकाया अमूर्त से पीड़ित हो सकता। यह प्रतिक्रिया देखें: JQuery's getJSON() not setting Accept header correctly?

यदि आप क्रॉस-डोमेन कॉल कर रहे हैं, तो ऐसा लगता है कि jQuery आपके द्वारा कॉल को सारणीबद्ध करने के कारण स्वीकृति शीर्षलेख सेट करने में सक्षम नहीं है।

आप कहते हैं कि सर्वर सही स्वीकृति हेडर देख रहा है, हालांकि। यह एक अलग मुद्दा इंगित कर सकता है।

2

मैं एक ही समस्या थी और मैं इसे इस तरह से (http://www.weverwijk.net/wordpress/tag/jquery/ देखें) का समाधान करने में सक्षम था:

$.ajax({ 
    url:'http://localhost:8080/sampleApplication/resources/personRestService/', 
    type:'POST', 
    data: JSON.stringify(person), 
    dataType: 'json', 
    contentType: "application/json; charset=utf-8", 
    success:function(res){ 
     alert("it works!"); 
    }, 
    error:function(res){ 
     alert("Bad thing happend! " + res.statusText); 
    } 
}); 

जावा तरफ मैं जोड़ा इन (Access-Control-Allow-Origin देखें):

@OPTIONS 
public Response testt(@Context HttpServletResponse serverResponse) { 
    serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    serverResponse.addHeader("Access-Control-Allow-Credentials", "true"); 
    serverResponse.addHeader("Access-Control-Allow-Origin", "*"); 
    serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With"); 
    serverResponse.addHeader("Access-Control-Max-Age", "60"); 
    return Response.ok().build(); 
} 

@POST 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(APPLICATION_JSON) 
public Response addPerson(MyJSONObj myObj, @Context HttpServletResponse serverResponse) 
    serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    serverResponse.addHeader("Access-Control-Allow-Credentials", "true"); 
    serverResponse.addHeader("Access-Control-Allow-Origin", "*"); 
    serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With"); 
    serverResponse.addHeader("Access-Control-Max-Age", "60"); 

    // ... 
    // ... 
} 

निष्कर्ष

  • JSON ऑब्जेक्ट ट्रांसफर हो जाता है और स्वतः बदल (अधिक जानकारी के Configuring JSON for RESTful Web Services देखें)
  • पोस्ट प्रतिबद्ध
  • क्रॉस-डोमेन (एक ही-उत्पत्ति-नीति)
  • फ़ायरफ़ॉक्स काम करता है (@Option टैग देख)
+0

@ ऑप्शन का परीक्षण किया गया और यह काम नहीं कर रहा है, हेडर को प्रतिक्रिया –

+0

में सेट किया जाना चाहिए, क्या आप अधिक जानकारी प्रदान कर सकते हैं जो त्रुटि उत्पन्न होती है? क्योंकि मैं अपनी सभी परियोजनाओं में इस कोड का उपयोग करता हूं। –

1

मुझे लगता है कि मूल पोस्ट के लिए होता है कोड दो अतिरिक्त बातें किया था काम:

JSON.serialize (व्यक्ति) करने के लिए सेट डेटा और डेटाप्रकार सेट'json' के बाद से contentType सही था, इस @PUT json का उपभोग करने की उम्मीद कर साथ काम करना चाहिए ...

0

कोशिश पहले यह @ wnm3 सुझाव के रूप में JSON प्रारूप के लिए अपने डेटा बदलें।

अगर अब भी समस्या का सामना जारी -

यह मुझे मदद की अगर आपके अनुरोध वाक्य रचना सही है।

@PUT 
//REMOVE THIS LINE !!!!!! ----- @Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public Response addPerson(MyJSONObj myObj) 

    // 
    //Your code here 
    return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") 
      .header("Access-Control-Allow-Credentials", true) 
      .build(); 
} 

मैं बिल्कुल पता नहीं है, कैसे CORS अनुरोध भेजने और आवेदन/json स्वीकार करेगा जो बनाने के लिए - यह जो 415 असमर्थित त्रुटि को दूर बात मैंने किया है। @ टोबियास सरनो द्वारा दिए गए उत्तर आंशिक रूप से गलत हैं। चूंकि आपको विकल्प की आवश्यकता नहीं है जो विकल्प अनुरोध स्वीकार करता है। भले ही ब्राउज़र दिखा रहा है कि यह विकल्प अनुरोध भेजता है, फिर भी यह @POST एनोटेशन के साथ विधि की तलाश करेगा। तो एक फ़िल्टर डालने या कुछ और करने के बजाय (अधिक परिष्कृत तरीकों) मैंने बिना किसी विधि के @ कंस्यूम्स और @ प्रोड्यूस के उपयोग करके त्वरित फिक्स के माध्यम से किया। उदाहरण के

@PUT 
public Response addPerson() { 
    return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") 
      .header("Access-Control-Allow-Credentials", true) 
      .build(); 
} 

@PUT 
@Consumes(MediaType.APPLICATION_JSON) 
public Response addPerson(MyJSONObj myObj) 
    // 
    //Your code here 
    // 
    return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") 
      .header("Access-Control-Allow-Credentials", true) 
      .build(); 
} 

तो यहाँ क्या हो रहा है के रूप में विकल्प के लिए प्रारंभिक CORS पहली विधि द्वारा नियंत्रित किया जाता है तो दूसरी विधि मूल PUT अनुरोध को संभालती है।

मैं यह जवाब यहां डाल रहा हूं क्योंकि मुझे यह पता लगाने में 3-4 दिन लग गए कि मेरा पुट अनुरोध क्यों नहीं चल रहा था। तो यह 415 त्रुटि वाले किसी व्यक्ति की मदद कर सकता है।

संबंधित मुद्दे