jquery ajax rest call – Tipo de medio no compatible

Tengo una llamada jja jaqueta ajax a un servicio de descanso. Estoy configurando contentType como “application / json” y el rest del recurso está configurado para aceptar ” MediaType.APPLICATION_JSON “. Este es un método POST. Con esta configuración, obtengo el error ” Tipo de medio no compatible “.

La información del encabezado muestra “Content-Type application / json; charset = UTF-8” en el encabezado de la solicitud

La respuesta muestra : Informe de estado: Tipo de medio no compatible El servidor rechazó esta solicitud porque la entidad de la solicitud está en un formato que el recurso solicitado no admite para el método solicitado (Tipo de medio no compatible).

Por favor, proporcione algunos consejos para resolver este problema.

Aquí está el fragmento de código:

Recurso de descanso

@POST @Produces({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML}) @Consumes({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML}) public Response addPerson(MyJSONObj myObj) { //... // ... //... } 

jquery

 $(document).ready(function() { /* put your stuff here */ $("#Button_save").click(function(){ var firstName = $('firstName').val(); var lastName = $('lastName').val(); var person = {firstName: firstName, lastName: lastName}; $.ajax({ url:'http://localhost:8080/sampleApplication/resources/personRestService/', type: 'POST', data: person, Accept : "application/json", contentType: "application/json", success:function(res){ alert("it works!"); }, error:function(res){ alert("Bad thing happend! " + res.statusText); } }); }); }); 

Encabezados como se muestra en FF Firebug

Cabeceras de respuesta

 Content-Length 1117 Content-Type text/html;charset=utf-8 Date Thu, 05 Apr 2012 09:44:45 GMT Server Apache-Coyote/1.1 

Encabezados de solicitud

 Accept */* Accept-Encoding gzip, deflate Accept-Language en-us,en;q=0.5 Connection keep-alive Content-Length 97 Content-Type application/json; charset=UTF-8 Host localhost:8080 Referer http://localhost:8080/sampleApplication/ User-Agent Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0 X-Requested-With XMLHttpRequest 

Tuve el mismo problema y pude resolverlo de esa manera (ver http://www.weverwijk.net/wordpress/tag/jquery/ ):

 $.ajax({ url:'http://localhost:8080/sampleApplication/resources/personRestService/', type:'POST', data: JSON.stringify(person), dataType: 'json', contentType: "application/json; charset=utf-8", success:function(res){ alert("it works!"); }, error:function(res){ alert("Bad thing happend! " + res.statusText); } }); 

En el lado de Java agregué estos (ver Access-Control-Allow-Origin ):

 @OPTIONS public Response testt(@Context HttpServletResponse serverResponse) { serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); serverResponse.addHeader("Access-Control-Allow-Credentials", "true"); serverResponse.addHeader("Access-Control-Allow-Origin", "*"); serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With"); serverResponse.addHeader("Access-Control-Max-Age", "60"); return Response.ok().build(); } @POST @Produces(MediaType.APPLICATION_JSON) @Consumes(APPLICATION_JSON) public Response addPerson(MyJSONObj myObj, @Context HttpServletResponse serverResponse) serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); serverResponse.addHeader("Access-Control-Allow-Credentials", "true"); serverResponse.addHeader("Access-Control-Allow-Origin", "*"); serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With"); serverResponse.addHeader("Access-Control-Max-Age", "60"); // ... // ... } 

Conclusión

  • El objeto JSON se transfiere y se transforma automáticamente (más detalles, consulte Configuración de JSON para servicios web RESTful )
  • Post compromiso
  • Dominio cruzado (política del mismo origen)
  • Firefox funciona (ver etiqueta @Option)

Creo que la publicación original hubiera funcionado si el código hubiera hecho dos cosas adicionales:

establezca los datos en JSON.serialize (persona) y establezca dataType en ‘json’ ya que contentType era correcto, esto debería funcionar con la función @PUT esperando consumir json …

Parece que puedes estar sufriendo de una abstracción con fugas. Vea esta respuesta: getQSON de JQuery () no está configurando Aceptar correctamente el encabezado?

Si está haciendo una llamada entre varios dominios, parece que no puede establecer el encabezado de aceptación debido a cómo jQuery le retira la llamada.

Sin embargo, usted dice que el servidor está viendo el encabezado de aceptación correcto. Eso podría estar indicando un tema diferente.

INTENTE ESTO PRIMERO Convierta sus datos a formato JSON como se sugiere en @ wnm3.

SI TODAVÍA ENFRENTANDO EL PROBLEMA CONTINÚE

Esto me ayudó, si su syntax de solicitud es correcta. Esto es lo que hice que elimina el error 415 No admitido –

 @PUT //REMOVE THIS LINE !!!!!! ----- @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public Response addPerson(MyJSONObj myObj) // //Your code here return Response.ok() .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") .header("Access-Control-Allow-Credentials", true) .build(); } 

No sé exactamente cómo hacer una solicitud CORS que enviará y aceptará application / json. La respuesta dada por @Tobias Sarnow es parcialmente incorrecta. Como no necesitas un método que acepte la solicitud de OPCIONES. Incluso si el navegador muestra que envía una solicitud de OPCIONES, seguirá buscando el método con la anotación @POST. Así que en lugar de poner un filtro o hacer otra cosa (formas más refinadas) lo hice a través de una solución rápida utilizando otro método sin @Consumes y @Produces. Ejemplo-

 @PUT public Response addPerson() { return Response.ok() .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") .header("Access-Control-Allow-Credentials", true) .build(); } @PUT @Consumes(MediaType.APPLICATION_JSON) public Response addPerson(MyJSONObj myObj) // //Your code here // return Response.ok() .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD") .header("Access-Control-Allow-Headers", "Content-Type,Accept,X-Requested-With,authorization") .header("Access-Control-Allow-Credentials", true) .build(); } 

Entonces, lo que sucede aquí es que el CORS inicial para OPCIONES se maneja con el primer método y luego el segundo con la solicitud PUT original.

Estoy poniendo esta respuesta aquí, ya que me tomó de 3 a 4 días para averiguar por qué no estaba pasando mi solicitud PUT. Así que puede ayudar a alguien que está teniendo error 415.