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.4
Bibliothek 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"}
java
json
http-status-code-415
user3443794
quelle
quelle
requestJson.toString()
Antworten:
Der Grund ist nicht sicher, aber das Entfernen von Zeilen
charset=utf8
aus hatcon.setRequestProperty("Content-Type", "application/json; charset=utf8")
das Problem behoben.quelle
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.charset=utf8
ist keine gültige Zeichensatzbezeichnung. Die richtige Version wärecharset=utf-8
. Der Bindestrich ist wichtig. Die Liste der gültigen Zeichensatzbezeichnungen wird von IANA RFC2879 verwaltet: iana.org/assignments/character-sets/character-sets.xhtmlHinzufügen
Content-Type
:application/json
undAccept
:application/json
quelle
Dies liegt daran,
charset=utf8
dass danach kein Leerzeichen mehr vorhanden sein sollteapplication/json
. Das wird gut funktionieren. Verwenden Sie es wieapplication/json;charset=utf-8
quelle
Wenn Sie eine Anfrage nach jquery ajax stellen, vergessen Sie nicht, diese hinzuzufügen
quelle
Wenn Sie
AJAX
jQuery
Request verwenden, ist dies ein Muss, um sich zu bewerben. Wenn nicht, wird es Ihnen415
Fehler werfen .quelle
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.
quelle
Wenn Sie dies in React RSAA Middleware oder ähnlichem erhalten, fügen Sie die Header hinzu:
quelle
Manchmal bricht Charset Metada den JSON, während die Anfrage gesendet wird. Verwenden Sie im Anfragetyp besser nicht charset = utf8.
quelle
Ich habe dies behoben, indem ich die
Request
Klasse aktualisiert habe, die mein Controller empfängt.Ich entfernte die folgende Klassenstufe Anmerkung aus meiner
Request
Klasse auf meiner Server - Seite. Danach hat mein Client keinen 415 Fehler erhalten.quelle
quelle
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.
quelle
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>
woObject3
enthältObject1
undObject2
und alles funktioniert gut.quelle
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.
quelle
Das manuelle Hinzufügen von MappingJackson2HttpMessageConverter in der Konfiguration löste das Problem für mich:
quelle
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
quelle