J'appelle un service REST avec une requête JSON et il répond avec une HTTP 415 "Unsupported Media Type"
erreur.
Le type de contenu de la demande est défini sur ("Content-Type", "application/json; charset=utf8")
.
Cela fonctionne bien si je n'inclus pas d'objet JSON dans la demande. J'utilise la google-gson-2.2.4
bibliothèque pour JSON.
J'ai essayé d'utiliser quelques bibliothèques différentes mais cela n'a fait aucune différence.
Quelqu'un peut-il m'aider à 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.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;
}
}
La valeur de requestJson.toString()
est:
{"type":"arl","action":"remove","domain":"staging","objects":"http://www.example.com"}
java
json
http-status-code-415
utilisateur3443794
la source
la source
requestJson.toString()
Réponses:
Vous n'êtes pas sûr de la raison, mais la suppression des lignes
charset=utf8
de acon.setRequestProperty("Content-Type", "application/json; charset=utf8")
résolu le problème.la source
charset
qu'ils soient définis dans Content-Type. Je suppose qu'ils vérifient si la chaîne"application/json; charset=utf-8" == "application/json"
. Cela étant dit, JSON doit être utf-8, il est donc parfaitement valide d'omettre le jeu de caractères.charset=utf8
n'est pas une désignation de jeu de caractères valide. La version correcte seraitcharset=utf-8
. Le tiret est important. La liste des désignations de jeux de caractères valides est gérée par IANA RFC2879: iana.org/assignments/character-sets/character-sets.xhtmlAjouter
Content-Type
:application/json
etAccept
:application/json
la source
C'est parce que
charset=utf8
devrait être sans espace aprèsapplication/json
. Cela fonctionnera très bien. Utilisez-le commeapplication/json;charset=utf-8
la source
Si vous faites une requête jquery ajax, n'oubliez pas d'ajouter
la source
Si vous utilisez
AJAX
jQuery
Request, c'est un must pour postuler. Sinon, cela vous lancera une415
erreur.la source
Ajoutez le gestionnaire d'en-têtes HTTP et ajoutez-y les noms et valeurs d'en-tête de votre API. Par exemple, Type de contenu, Accepter, etc. Cela résoudra votre problème.
la source
Si vous obtenez cela dans le middleware React RSAA ou similaire, ajoutez les en-têtes:
la source
Parfois, Charset Metada rompt le json lors de l'envoi de la requête. Mieux, n'utilisez pas charset = utf8 dans le type de requête.
la source
J'ai résolu ce problème en mettant à jour la
Request
classe que mon contrôleur reçoit.J'ai supprimé l'annotation de niveau de classe suivante de ma
Request
classe du côté de mon serveur. Après cela, mon client n'a pas eu d'erreur 415.la source
la source
J'envoyais une demande de repos "Supprimer" et cela a échoué avec 415. J'ai vu quel type de contenu mon serveur utilise pour atteindre l'API. Dans mon cas, c'était "application / json" au lieu de "application / json; charset = utf8".
Alors demandez à votre développeur api Et en attendant, essayez d'envoyer la requête avec content-type = "application / json" uniquement.
la source
J'ai eu le même problème. Mon problème était un objet compliqué pour la sérialisation. Un attribut de mon objet était
Map<Object1, List<Object2>>
. J'ai changé cet attribut commeList<Object3>
whereObject3
containsObject1
etObject2
et tout fonctionne bien.la source
Je sais que c'est trop tard pour aider l'OP avec son problème, mais pour nous tous qui rencontrons ce problème, j'avais résolu ce problème en supprimant le constructeur avec les paramètres de ma classe qui était censé contenir les données json.
la source
Ajouter manuellement MappingJackson2HttpMessageConverter dans la configuration a résolu le problème pour moi:
la source
La raison peut être de ne pas ajouter "piloté par annotations" dans votre fichier xml de servlet de répartiteur. et aussi cela peut être dû à ne pas ajouter en tant qu'application / json dans les en-têtes
la source