Estoy llamando a un servicio REST con una solicitud JSON y responde con un HTTP 415 "Unsupported Media Type"
error.
El tipo de contenido de la solicitud se establece en ("Content-Type", "application/json; charset=utf8")
.
Funciona bien si no incluyo un objeto JSON en la solicitud. Estoy usando la google-gson-2.2.4
biblioteca para JSON.
Intenté usar un par de bibliotecas diferentes pero no hizo ninguna diferencia.
¿Alguien puede ayudarme a resolver esto?
Aquí está mi código:
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;
}
}
El valor de requestJson.toString()
es:
{"type":"arl","action":"remove","domain":"staging","objects":"http://www.example.com"}
java
json
http-status-code-415
usuario3443794
fuente
fuente
requestJson.toString()
Respuestas:
No estoy seguro de la razón, sino líneas Extracción
charset=utf8
decon.setRequestProperty("Content-Type", "application/json; charset=utf8")
resuelto el problema.fuente
charset
que se establezcan en el tipo de contenido. Supongo que están comprobando si la cuerda"application/json; charset=utf-8" == "application/json"
. Dicho esto, JSON debe ser utf-8, por lo que es perfectamente válido omitir el juego de caracteres.charset=utf8
no es una designación de juego de caracteres válida. La versión correcta seríacharset=utf-8
. El guión es importante. La lista de designaciones de conjuntos de caracteres válidos es administrada por IANA RFC2879: iana.org/assignments/character-sets/character-sets.xhtmlAgregar
Content-Type
:application/json
yAccept
:application/json
fuente
Esto se debe a que
charset=utf8
debe quedar sin un espacio despuésapplication/json
. Eso funcionará bien. Úselo comoapplication/json;charset=utf-8
fuente
Si está haciendo una solicitud jquery ajax, no olvide agregar
fuente
Si está utilizando
AJAX
jQuery
Solicitar, esta es una solicitud obligatoria. Si no, te arrojará415
Error.fuente
Agregue el administrador de encabezado HTTP y agregue en él los nombres y valores de encabezado de su API. por ejemplo, tipo de contenido, aceptar, etc. Eso resolverá su problema.
fuente
Si obtiene esto en el middleware React RSAA o similar, agregue los encabezados:
fuente
Algunas veces Charset Metada rompe el json al enviar la solicitud. Mejor, no use charset = utf8 en el tipo de solicitud.
fuente
Solucioné esto actualizando la
Request
clase que recibe mi controlador.Me quité la siguiente anotación nivel de clase de mi
Request
clase en mi lado del servidor. Después de eso, mi cliente no recibió el error 415.fuente
fuente
Estaba enviando una solicitud de descanso de "eliminación" y falló con 415. Vi qué tipo de contenido usa mi servidor para acceder a la API. En mi caso, era "application / json" en lugar de "application / json; charset = utf8".
Pregúntele a su desarrollador de api. Mientras tanto, intente enviar la solicitud con content-type = "application / json" solamente.
fuente
Tuve el mismo problema. Mi problema era un objeto complicado para la serialización. Un atributo de mi objeto fue
Map<Object1, List<Object2>>
. He cambiado este atributo comoList<Object3>
cuandoObject3
contieneObject1
yObject2
y todo funciona bien.fuente
Sé que es demasiado tarde para ayudar al OP con su problema, pero para todos los que acabamos de encontrarnos con este problema, resolví este problema eliminando el constructor con los parámetros de mi clase, que estaba destinado a contener los datos json.
fuente
Agregar MappingJackson2HttpMessageConverter manualmente en la configuración resolvió el problema para mí:
fuente
El motivo puede ser no agregar "controlado por anotaciones" en el archivo xml del servlet del despachador. y también puede deberse a no agregar como aplicación / json en los encabezados
fuente