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"}

user3443794
quelle
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.

user3443794
quelle
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

Parth Solanki
quelle
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

Dhruv
quelle
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'
karthik
quelle
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'
Dulith De Costa
quelle
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.

Arjun Duggal
quelle
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),
Nalan Madheswaran
quelle
1

Manchmal bricht Charset Metada den JSON, während die Anfrage gesendet wird. Verwenden Sie im Anfragetyp besser nicht charset = utf8.

Murali Gundappan
quelle
2
utf8 ist einfach kein gültiger Zeichensatz. Schauen Sie sich die Spezifikation an: iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch
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
javaPlease42
quelle
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

TiyebM
quelle
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.

Rahul Rastogi
quelle
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.

spajdo
quelle
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.

Jero Dungog
quelle
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);
    }
}
Jéjé
quelle
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

BHARATHWAJ
quelle