JSON के साथ Http 415 असमर्थित मीडिया प्रकार त्रुटि


115

मैं JSON अनुरोध के साथ REST सेवा को कॉल कर रहा हूं और यह एक HTTP 415 "Unsupported Media Type"त्रुटि के साथ प्रतिक्रिया करता है ।

अनुरोध सामग्री प्रकार पर सेट है ("Content-Type", "application/json; charset=utf8")

यदि मैं अनुरोध में JSON ऑब्जेक्ट शामिल नहीं करता हूं तो यह ठीक काम करता है। मैं google-gson-2.2.4JSON के लिए लाइब्रेरी का उपयोग कर रहा हूं ।

मैंने विभिन्न पुस्तकालयों के एक जोड़े का उपयोग करने की कोशिश की, लेकिन इससे कोई फर्क नहीं पड़ा।

किसी को भी इसे हल करने के लिए मेरी मदद कर सकते हैं?

यहाँ मेरा कोड है:

public static void main(String[] args) throws Exception
{

    JsonObject requestJson = new JsonObject();
    String url = "xxx";

    //method call for generating json

    requestJson = generateJSON();
    URL myurl = new URL(url);
    HttpURLConnection con = (HttpURLConnection)myurl.openConnection();
    con.setDoOutput(true);
    con.setDoInput(true);

    con.setRequestProperty("Content-Type", "application/json; charset=utf8");
    con.setRequestProperty("Accept", "application/json");
    con.setRequestProperty("Method", "POST");
    OutputStream os = con.getOutputStream();
    os.write(requestJson.toString().getBytes("UTF-8"));
    os.close();


    StringBuilder sb = new StringBuilder();  
    int HttpResult =con.getResponseCode();
    if(HttpResult ==HttpURLConnection.HTTP_OK){
    BufferedReader br = new BufferedReader(new   InputStreamReader(con.getInputStream(),"utf-8"));  

        String line = null;
        while ((line = br.readLine()) != null) {  
        sb.append(line + "\n");  
        }
         br.close(); 
         System.out.println(""+sb.toString());  

    }else{
        System.out.println(con.getResponseCode());
        System.out.println(con.getResponseMessage());  
    }  

}
public static JsonObject generateJSON () throws MalformedURLException

{
   String s = "http://www.example.com";
        s.replaceAll("/", "\\/");
    JsonObject reqparam=new JsonObject();
    reqparam.addProperty("type", "arl");
    reqparam.addProperty("action", "remove");
    reqparam.addProperty("domain", "staging");
    reqparam.addProperty("objects", s);
    return reqparam;

}
}

का मान requestJson.toString()है:

{"type":"arl","action":"remove","domain":"staging","objects":"http://www.example.com"}


कृपया अपने प्रश्न को अपडेट करेंrequestJson.toString()
सबुज हसन

1
अनुरोध का मानJson.toString है: {"type": "arl", "action": "remove", "domain": "स्टेजिंग", "ऑब्जेक्ट्स": " abc.com "}
user3443794

क्या आपने सर्वर भाग लिखा है? यदि आप पोस्टमैन (क्रोम एक्सटेंशन, Google यह) के साथ एक ही अनुरोध करते हैं, तो क्या यह काम करता है? शायद सर्वर किसी कारण से JSON सामग्री प्रकार को स्वीकार नहीं करता है?
जोंकरसन

हां मैंने परीक्षण किया है कि साबुनयूआई का उपयोग करना। मैंने json सहित सटीक समान अनुरोध भेजा और सर्वर से सफल प्रतिक्रिया मिली।
user3443794

@joscarsson, 14 मार्च 2017 के बाद से, पोस्टमैन क्रोम विस्तार पदावनत है। वे मूल ऐप में चले गए। यहाँ उनके ब्लॉग पोस्ट है: http://blog.getpostman.com/2017/03/14/going-native/
सर्ज किशिको

जवाबों:


81

कारण के बारे में निश्चित नहीं है लेकिन समस्या charset=utf8को con.setRequestProperty("Content-Type", "application/json; charset=utf8")हल करने से लाइनों को हटाना


यह शायद रेस्ट सर्विस में एक बग है। उन्हें शायद charsetसामग्री-प्रकार में सेट होने की उम्मीद नहीं है । मेरा अनुमान है कि वे जाँच कर रहे हैं कि क्या स्ट्रिंग है "application/json; charset=utf-8" == "application/json"। यह कहा जा रहा है, JSON को utf-8 होना चाहिए, ताकि यह चारसेट को छोड़ने के लिए पूरी तरह से वैध हो।
टिम मार्टिन

19
क्योंकि charset=utf8एक वैध चरित्र सेट पदनाम नहीं है। सही संस्करण होगा charset=utf-8। पानी का छींटा जरूरी है। मान्य वर्ण सेट पदनामों की सूची IANA RFC2879 द्वारा प्रबंधित की जाती है: iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch

अलग-अलग चीजों की कोशिश में बहुत समय बर्बाद किया और फिर charset = utf8 को हटाने की कोशिश की और यह काम किया। धन्यवाद।
सलमान

53

जोड़ें Content-Type: application/jsonऔर Accept:application/json


1
यदि आप परीक्षण के लिए पोस्टमैन का उपयोग कर रहे हैं, तो हेडर में इस भाग को जोड़ने का प्रयास करें : सामग्री-प्रकार: आवेदन / json
Z3d4s

13

ऐसा इसलिए है क्योंकि charset=utf8बाद में एक जगह के बिना होना चाहिए application/json। यह ठीक काम करेगा। इसका उपयोग करेंapplication/json;charset=utf-8


यह गलत है; रिक्त स्थान की अनुमति है और इसे अनदेखा किया जाना चाहिए; tools.ietf.org/html/rfc2046 देखें ।
djb

11

यदि आप jquery ajax अनुरोध कर रहे हैं, तो जोड़ना न भूलें

contentType:'application/json'

4

यदि आप AJAX jQueryअनुरोध का उपयोग कर रहे हैं तो इसे लागू करना आवश्यक है। यदि नहीं, तो यह आपको फेंक देगा 415

dataType: "json",
contentType:'application/json'

2

HTTP शीर्ष लेख प्रबंधक जोड़ें और इसमें अपने API के शीर्ष लेख नाम और मान जोड़ें। उदाहरण के लिए, सामग्री-प्रकार, स्वीकार आदि, जो आपकी समस्या का समाधान करेगा।


2

यदि आपको यह प्रतिक्रिया आरएसएए मिडलवेयर या समान में मिलती है, तो हेडर जोड़ें:

  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(model),

1

अनुरोध में भेजने के दौरान कुछ बार चार्सेट मेटाडा ने इस जीन्स को तोड़ दिया। बेहतर, अनुरोध प्रकार में charset = utf8 का उपयोग न करें।


2
utf8 सिर्फ एक वैध वर्ण सेट नहीं है। युक्ति को देखें: iana.org/assignments/character-sets/character-sets.xhtml
बेरिन लोरिट्स

1

मैंने Requestअपने नियंत्रक को प्राप्त होने वाली कक्षा को अपडेट करके इसे ठीक किया ।

मैंने अपने सर्वर साइड पर अपनी कक्षा से निम्न श्रेणी स्तर एनोटेशन को हटा दियाRequest । उसके बाद मेरे ग्राहक को 415 त्रुटि नहीं मिली।

import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement

1

415 (असमर्थित मीडिया प्रकार) स्थिति कोड इंगित करता है कि मूल सर्वर अनुरोध को सेवा देने से इनकार कर रहा है क्योंकि पेलोड एक प्रारूप में है जो लक्ष्य संसाधन पर इस पद्धति द्वारा समर्थित नहीं है। प्रारूप समस्या, संकेतित सामग्री-प्रकार या सामग्री-एन्कोडिंग के कारण या सीधे डेटा का निरीक्षण करने के परिणामस्वरूप हो सकती है। डॉक्टर


0

मैं "हटा" बाकी अनुरोध भेज रहा था और यह 415 के साथ विफल रहा। मैंने देखा कि मेरे सर्वर एपी को हिट करने के लिए किस प्रकार के सामग्री का उपयोग करता है। मेरे मामले में, यह "एप्लिकेशन / जसन" के बजाय "एप्लिकेशन / जसन" था; चारसेट = utf8 "।

तो अपने एपीआई डेवलपर से पूछें और इस बीच केवल सामग्री-प्रकार = "आवेदन / json" के साथ अनुरोध भेजने का प्रयास करें।


0

मेरी भी यही समस्या थी। मेरी समस्या क्रमबद्धता के लिए जटिल वस्तु थी। मेरी वस्तु का एक गुण था Map<Object1, List<Object2>>। मैं की तरह इस विशेषता बदल List<Object3>जहां Object3होता है Object1और Object2और सब कुछ ठीक काम करता है।


0

मुझे पता है कि ओपी को अपनी समस्या से मदद करने के लिए यह बहुत देर हो चुकी है, लेकिन हम सभी के लिए जो इस समस्या का सामना कर रहे हैं, मैंने अपनी कक्षा के मापदंडों के साथ कंस्ट्रक्टर को हटाकर इस मुद्दे को हल कर लिया था जो कि json डेटा को रखने के लिए था।


0

MappingJackson2HttpMessageConverter मैन्युअल रूप से कॉन्फ़िगरेशन में जोड़ें मेरे लिए समस्या हल हो गई:

@EnableWebMvc
@Configuration
@ComponentScan
public class RestConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        messageConverters.add(new MappingJackson2HttpMessageConverter());
        super.configureMessageConverters(messageConverters);
    }
}

0

कारण आपके डिस्पैचर सर्वलेट xml फ़ाइल में "एनोटेशन-संचालित" नहीं जोड़ा जा सकता है। और यह भी हेडर में आवेदन / json के रूप में नहीं जोड़ने के कारण हो सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.