webentwicklung-frage-antwort-db.com.de

HTTP 415 Nicht unterstützter Medientypfehler mit JSON

Ich rufe den REST - Dienst mit der JSON-Anforderung an und es wird der Fehler 415 "Nicht unterstützter Medientyp" ausgegeben. 

Anforderungsinhaltstyp ist auf "Inhaltstyp", "application/json; charset = utf8") gesetzt. 

Es funktioniert gut, wenn ich kein Json-Objekt in die Anfrage einbeziehe. Ich verwende Google-Gson-2.2.4-Bibliothek für Json. 

Ich habe versucht, ein paar verschiedene Bibliotheken zu verwenden, aber es machte keinen Unterschied.

Kann mir jemand bitte helfen, das zu lösen? 

Hier ist mein Code: 

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.abc.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;

}
}

Der Wert von requestJson.toString ist: 

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

72
user3443794

Über den Grund nicht sicher, aber das Entfernen von Zeilen charset=utf8 aus con.setRequestProperty("Content-Type", "application/json; charset=utf8") hat das Problem behoben.

65
user3443794

Fügen Sie den Inhaltstyp hinzu: application/json und akzeptieren Sie: application/json

31
Parth Solanki

Dies liegt daran, dass charset=utf8 nach application/json kein Leerzeichen enthalten sollte. Das wird gut funktionieren. Verwenden Sie es wie application/json;charset=utf-8

8
Dhruv

Wenn Sie eine Ajax-Anfrage machen, vergessen Sie nicht, diese hinzuzufügen 

contentType:'application/json'
7
karthik

Fügen Sie den HTTP-Header-Manager hinzu und fügen Sie darin die Header-Namen und -werte der API hinzu. Inhaltstyp, Akzeptieren usw. Dadurch wird Ihr Problem behoben.

2
Arjun Duggal

Manchmal unterbrechen Charset-Metadaten den Json, während die Anforderung gesendet wird. Verwenden Sie besser nicht charset = utf8 im Anforderungstyp.

1

Wenn Sie AJAXjQuery Request verwenden, müssen Sie dies beantragen. Wenn nicht, wird es 415 Fehler werfen.

dataType: "json",
contentType:'application/json'
1
Dulith De Costa

Wenn Sie dies in der React RSAA-Middleware oder einer ähnlichen Version erhalten, fügen Sie die Header hinzu:

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

MappingJackson2HttpMessageConverter manuell in der Konfiguration hinzugefügt, hat das Problem für mich gelöst:

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

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

Ich hatte das gleiche Problem. Mein Problem war ein kompliziertes Objekt für die Serialisierung. Ein Attribut meines Objekts war Map<Object1, List<Object2>>. Ich habe dieses Attribut wie List<Object3> geändert, wobei Object3Object1 und Object2 enthält und alles gut funktioniert.

0
spajdo

Ich habe eine "delete" -Restanforderung gesendet und diese ist mit 415 fehlgeschlagen. Ich habe festgestellt, welchen Inhaltstyp mein Server verwendet, um die API zu treffen. In meinem Fall war es "application/json" anstelle von "application/json; charset = utf8".

Fragen Sie Ihren api-Entwickler. Versuchen Sie in der Zwischenzeit, die Anfrage nur mit content-type = "application/json" zu senden.

0
Rahul Rastogi

Der Grund kann darin liegen, dass Sie in Ihrer Dispatcher-Servlet-XML-Datei nicht "annotationsgesteuert" hinzufügen. und es kann auch daran liegen, dass nicht als application/json in den Headern hinzugefügt wird

0
BHARATHWAJ

Ich weiß, dass dies zu spät ist, um dem OP bei seinem Problem zu helfen, aber für alle, die gerade auf dieses Problem stoßen, hatte ich dieses Problem gelöst, indem ich den Konstruktor mit den Parametern meiner Klasse entfernt hatte, die das enthalten sollte Json-Daten.

0
Jero Dungog

Ich habe dies behoben, indem ich die Klasse Request aktualisiert habe, die mein Controller empfängt.

Ich entfernt die folgende Annotation auf Klassenebene von meiner Klasse Request auf meiner Serverseite. Danach mein Client hat 415 Fehler nicht bekommen.

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