HTTP 415 Nicht unterstützter Medientypfehler mit JSON


114

Ich rufe einen REST-Service mit einer JSON-Anfrage auf und er antwortet mit einem HTTP 415 "Unsupported Media Type"Fehler.

Der Anforderungsinhaltstyp ist auf festgelegt ("Content-Type", "application/json; charset=utf8").

Es funktioniert gut, wenn ich kein JSON-Objekt in die Anfrage einbinde. Ich benutze die google-gson-2.2.4Bibliothek für JSON.

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

Kann mir bitte jemand 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.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;

}
}

Der Wert von requestJson.toString()ist:

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


Bitte aktualisieren Sie Ihre Frage mit dem Wert vonrequestJson.toString()
Sabuj Hassan

1
Der Wert von requestJson.toString ist: {"Typ": "arl", "Aktion": "Entfernen", "Domäne": "Staging", "Objekte": " abc.com "}
user3443794

Hast du den Serverteil geschrieben? Wenn Sie dieselbe Anfrage mit Postman (Chrome-Erweiterungen, Google it) stellen, funktioniert sie dann? Vielleicht akzeptiert der Server den JSON-Inhaltstyp aus irgendeinem Grund nicht?
Joscarsson

Ja, ich habe das mit soapUI getestet. Ich habe genau die gleiche Anfrage einschließlich json gesendet und eine erfolgreiche Antwort vom Server erhalten.
user3443794

@joscarsson, seit dem 14. März 2017 ist die Postman-Chrome-Erweiterung veraltet. Sie sind zur nativen App gewechselt. Hier ist ihr Blog-Beitrag: http://blog.getpostman.com/2017/03/14/going-native/
Serge Kishiko

Antworten:


81

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


Es ist wahrscheinlich ein Fehler im ReST-Dienst. Es wird wahrscheinlich nicht erwartet charset, dass sie im Inhaltstyp festgelegt werden. Ich vermute, dass sie prüfen, ob die Zeichenfolge "application/json; charset=utf-8" == "application/json". Davon abgesehen muss JSON utf-8 sein, daher ist es vollkommen gültig, den Zeichensatz wegzulassen.
Tim Martin

19
Da charset=utf8ist keine gültige Zeichensatzbezeichnung. Die richtige Version wäre charset=utf-8. Der Bindestrich ist wichtig. Die Liste der gültigen Zeichensatzbezeichnungen wird von IANA RFC2879 verwaltet: iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch

Wir haben viel Zeit damit verschwendet, verschiedene Dinge auszuprobieren und dann den Zeichensatz = utf8 zu entfernen, und es hat funktioniert. Vielen Dank.
Salman

53

Hinzufügen Content-Type: application/jsonund Accept:application/json


1
Wenn Sie Postman zum Testen verwenden, versuchen Sie, diesen Teil zu den Headern hinzuzufügen : Inhaltstyp: application / json
Z3d4s

13

Dies liegt daran, charset=utf8dass danach kein Leerzeichen mehr vorhanden sein sollte application/json. Das wird gut funktionieren. Verwenden Sie es wieapplication/json;charset=utf-8


Das ist falsch; Leerzeichen sind zulässig und sollten ignoriert werden. Siehe tools.ietf.org/html/rfc2046 .
DJB

11

Wenn Sie eine Anfrage nach jquery ajax stellen, vergessen Sie nicht, diese hinzuzufügen

contentType:'application/json'

4

Wenn Sie AJAX jQueryRequest verwenden, ist dies ein Muss, um sich zu bewerben. Wenn nicht, wird es Ihnen 415Fehler werfen .

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

2

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


2

Wenn Sie dies in React RSAA Middleware oder ähnlichem erhalten, fügen Sie die Header hinzu:

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


1

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

Ich entfernte die folgende Klassenstufe Anmerkung aus meiner RequestKlasse auf meiner Server - Seite. Danach hat mein Client keinen 415 Fehler erhalten.

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

1

Der Statuscode 415 (Nicht unterstützter Medientyp) gibt an, dass der Ursprungsserver die Bearbeitung der Anforderung ablehnt, da die Nutzdaten in einem Format vorliegen, das von dieser Methode auf der Zielressource nicht unterstützt wird. Das Formatproblem kann auf den angegebenen Inhaltstyp oder die Inhaltskodierung der Anforderung oder auf die direkte Überprüfung der Daten zurückzuführen sein. DOC


0

Ich habe eine Rest-Anfrage zum Löschen gesendet und sie ist mit 415 fehlgeschlagen. Ich habe gesehen, welchen Inhaltstyp mein Server verwendet, um die API zu erreichen. In meinem Fall war es "application / json" anstelle von "application / json; charset = utf8".

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


0

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 geändert, z. B. List<Object3>wo Object3enthält Object1und Object2und alles funktioniert gut.


0

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


0

Das manuelle Hinzufügen von MappingJackson2HttpMessageConverter in der Konfiguration löste das Problem für mich:

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

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

0

Der Grund kann sein, dass in Ihrer XML-Datei für das Dispatcher-Servlet nicht "annotationsgesteuert" hinzugefügt wird. und es kann auch daran liegen, dass nicht als application / json in den Headern hinzugefügt wird

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.