jquery ajax rest call – Type de support non pris en charge

Je vais avoir un simple appel ajax jQuery à un service de repos. Je configure le contentType comme “application / json” et la ressource restante est configurée pour accepter ” MediaType.APPLICATION_JSON “. Ceci est une méthode POST. Avec cette configuration, je reçois le message d’ erreur « Type de support non pris en charge ».

Les informations d’en-tête indiquent “Content-Type application / json; charset = UTF-8” dans l’en-tête de la demande.

La réponse indique : Rapport d’état: Type de support non pris en charge Le serveur a refusé cette demande car l’entité de la demande est dans un format non pris en charge par la ressource demandée pour la méthode demandée (type de support non pris en charge).

Veuillez fournir des indications pour résoudre ce problème.

Voici l’extrait de code:

Ressource de repos

@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); } }); }); }); 

En-têtes affichés dans FF Firebug

En-têtes de réponse

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

En-têtes de demande

 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 

J’ai eu le même problème et j’ai pu le résoudre de cette façon (voir http://www.weverwijk.net/wordpress/tag/jquery/ ):

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

Du côté de Java, j’ai ajouté ces éléments (voir 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"); // ... // ... } 

Conclusion

  • L’object JSON est transféré et transformé automatiquement (pour plus de détails, voir Configuration de JSON pour les services Web RESTful )
  • POST commit
  • Domaine croisé (politique d’origine identique)
  • Firefox fonctionne (voir la balise @Option)

Je pense que le message original aurait fonctionné si le code avait généré deux choses supplémentaires:

définissez les données sur JSON.serialize (personne) et définissez le type de données sur ‘json’ puisque le type de contenu est correct, cela devrait fonctionner avec le @PUT qui s’attend à consumr du json …

Il semblerait que vous souffriez d’une abstraction qui fuit. Voir cette réponse: getJSON () de JQuery ne définit pas correctement l’en-tête Accepter?

Si vous effectuez un appel entre domaines, il semble que vous ne puissiez pas définir l’en-tête d’acceptation en raison de la manière dont jQuery abstrait l’appel de votre part.

Vous dites cependant que le serveur voit le bon en-tête d’acceptation, cependant. Cela pourrait indiquer un problème différent.

ESSAYEZ-LE EN PREMIER Convertissez vos données au format JSON comme le suggère @ wnm3.

SI ENCORE FACE AU PROBLÈME, CONTINUEZ –

Cela m’a aidé si votre syntaxe de requête est correcte. C’est ce que j’ai fait pour supprimer l’erreur 415 non prise en charge –

 @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(); } 

Je ne sais pas exactement comment faire une demande CORS qui enverra et acceptera application / json. La réponse donnée par @Tobias Sarnow est partiellement incorrecte. Comme vous n’avez pas besoin de méthode qui accepte la demande OPTIONS. Même si le navigateur indique qu’il envoie une demande OPTIONS, il recherchera toujours une méthode avec l’annotation @POST. Ainsi, au lieu de mettre en place un filtre ou de faire autre chose (moyens plus raffinés), j’ai utilisé une solution rapide en utilisant une autre méthode sans @Consumes et @Produces. Exemple-

 @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(); } 

Donc, ce qui se passe ici est que la première CORS pour OPTIONS est gérée par la première méthode, puis la deuxième méthode gère la demande PUT d’origine.

Je mets cette réponse ici car il m’a fallu 3 ou 4 jours pour comprendre pourquoi ma demande PUT n’était pas acceptée. Donc, cela peut aider quelqu’un qui a 415 erreur.