web-dev-qa-db-fra.com

Http 415 Erreur de type de support non supporté avec JSON

J'appelle le service REST avec une requête JSON et donne l'erreur HTTP 415 "Type de support non pris en charge". 

Le type de contenu de la demande est défini sur ("Content-Type", "application/json; charset = utf8"). 

Cela fonctionne bien si je n'inclue pas l'objet Json dans la demande. J'utilise la bibliothèque google-gson-2.2.4 pour json. 

J'ai essayé d'utiliser deux bibliothèques différentes, mais cela ne faisait aucune différence.

Quelqu'un peut-il m'aider s'il vous plaît à résoudre ce problème? 

Voici mon 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.abc.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;

}
}

La valeur de requestJson.toString est: 

{"type": "arl", "action": "remove", "domaine": "staging", "objets": " http://www.abc.com "}

72
user3443794

Pas sûr de la raison mais Supprimer les lignes charset=utf8 de con.setRequestProperty("Content-Type", "application/json; charset=utf8") a résolu le problème.

65
user3443794

Ajouter le type de contenu: application/json et accepter: application/json

31
Parth Solanki

Ceci est dû au fait que charset=utf8 devrait être sans espace après application/json. Cela fonctionnera bien. Utilisez-le comme application/json;charset=utf-8

8
Dhruv

Si vous faites une demande jquery ajax, n'oubliez pas d'ajouter 

contentType:'application/json'
7
karthik

Ajoutez le gestionnaire d'en-tête HTTP et ajoutez-y les noms et les valeurs d'en-tête de votre API . Content-type, Accept, etc. Cela résoudra votre problème.

2
Arjun Duggal

Parfois, Metset Data définit le json lors de l'envoi de la requête. Mieux, n'utilisez pas charset = utf8 dans le type de requête.

1

Si vous utilisez AJAXjQuery Request, il est indispensable de l'appliquer. Sinon, cela vous jettera 415 Erreur.

dataType: "json",
contentType:'application/json'
1
Dulith De Costa

Si vous obtenez cela dans le middleware React RSAA ou similaire, ajoutez les en-têtes:

  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(model),
0
Nalan Madheswaran

Ajouter MappingJackson2HttpMessageConverter manuellement dans la configuration a résolu le problème pour moi:

@EnableWebMvc
@Configuration
@ComponentScan
public class RestConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        messageConverters.add(new MappingJackson2HttpMessageConverter());
        super.configureMessageConverters(messageConverters);
    }
}
0
Jéjé

J'ai eu le même problème. Mon problème était objet compliqué pour la sérialisation. Un attribut de mon objet était Map<Object1, List<Object2>>. J'ai changé cet attribut comme List<Object3>Object3 contient Object1 et Object2 et tout fonctionne bien.

0
spajdo

J'envoyais une requête de repos "delete" et elle a échoué avec 415. J'ai vu le type de contenu utilisé par mon serveur pour frapper l'API. Dans mon cas, c'était "application/json" au lieu de "application/json; charset = utf8".

Alors demandez à votre développeur api Et entre-temps, essayez d'envoyer une requête avec content-type = "application/json" uniquement.

0
Rahul Rastogi

La raison peut être de ne pas ajouter "piloté par annotation" dans votre fichier xml servlet de répartiteur. et aussi cela peut être dû à ne pas ajouter en tant qu'application/json dans les en-têtes

0
BHARATHWAJ

Je sais que c’est beaucoup trop tard pour aider le PO à résoudre son problème, mais à tous ceux qui rencontrent ce problème, j’avais résolu ce problème en supprimant le constructeur avec les paramètres de ma classe qui était censé tenir le données JSON.

0
Jero Dungog

J'ai résolu ce problème en mettant à jour la classe Request que mon contrôleur reçoit.

I enlevé l'annotation de niveau de classe suivante de ma classe Request sur mon serveur. Après que mon client n'a pas eu d'erreur 415.

import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
0
javaPlease42