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 "}
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.
Ajouter le type de contenu: application/json
et accepter: application/json
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
Si vous faites une demande jquery ajax, n'oubliez pas d'ajouter
contentType:'application/json'
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.
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.
Si vous utilisez AJAX
jQuery
Request, il est indispensable de l'appliquer. Sinon, cela vous jettera 415
Erreur.
dataType: "json",
contentType:'application/json'
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),
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);
}
}
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>
où Object3
contient Object1
et Object2
et tout fonctionne bien.
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.
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
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.
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