J'ai créé un service Web REST à l'aide de jax-rs et d'un maillot censé consommer du JSON lors d'une demande POST. Ma classe de service Web ressemble à ceci:
@Path("/webhookservice")
public class Webhook {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response readData (Song song) {
// Prints out the song info
System.out.println("SONG INFO \n=======================");
System.out.println("songname: " + song.getSongname());
System.out.println("artist: " + song.getArtist());
// Repsonse with a HTTP 200 OK
Response response = Response.status(200).build();
return response;
}
}
Ma classe de chanson:
public class Song {
private String songname;
private String artist;
public String getSongname () { return this.songname; }
public String getArtist () { return this.artist; }
public void setSongname (String songname) { this.songname = songname; }
public void setArtist (String artist) { this.artist = artist; }
}
Mon web.xml (si nécessaire)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://Java.Sun.com/xml/ns/javaee"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>SnapScan-Webhook</servlet-name>
<servlet-class>com.Sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>za.co.lancet.service</param-value>
</init-param>
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SnapScan-Webhook</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
J'utilise RESTClient un peu, eh bien, client de repos ... Voici une capture d'écran de ce que j'envoie:
Lorsque je l’envoie, le message 415 Type de support non supporté apparaît. Quelqu'un a une idée pourquoi?
Vous devez envoyer le request-header Content-Type: application/json
. On dirait que REST-Client n'ajoute pas cet en-tête automatiquement pour vous.
Comme d'autres l'ont souligné, il vous manque le bon en-tête. Ajoutez Content-Type: application/json
aux "en-têtes":
J'ai eu la même erreur 415
http il y a. J'ai simplement oublié le constructeur sans paramètres par défaut dans mes classes DTO. L'ajout de ce constructeur, de la même manière que pour les entités JPA, a résolu mon problème et la désérialisation JSON->Object
fonctionne maintenant.
Je ne suis pas sûr que ce soit votre cas, si vous examinez votre code, mais cela pourrait être utile aux autres types qui consultent le numéro 415 + JSON ...
J'ai tendance à ajouter
@Produces({"application/json"})
mes services par rapport à la déclaration de classe de niveau supérieur et la substitution, le cas échéant.
par exemple.
@Path("/foo")
@Produces({"application/json"})
public class FooRestService {
Bien que ce soit une expérience idiote à partager, je vais la partager au cas où cela sauverait la journée de quelqu'un d'autre.
J'avais un ensemble de fonctions consécutives, la première étant avec l'annotation @BodyParser.Of(BodyParser.Json.class)
, lorsque j'ai commenté cette fonction, la ligne d'annotation était laissée sans commentaire par erreur, de sorte que cette annotation était appliquée à cette seconde fonction, ce qui entraînait une telle erreur de type de support.
hth
Ok, des codes d'erreur apparaissent généralement lors de la négociation de contenu 1) 406 - Inacceptable 2) 415 - Type de support non pris en charge
406 se produit lorsque le serveur n'accepte pas le type de contenu envoyé sous l'en-tête ACCEPT de la demande.
415 est le client qui envoie un type de contenu dans l'en-tête de la requête et le serveur refuse donc carrément de dire le type de média non pris en charge
pour surmonter 406, nous devons inclure les fichiers JAR dépendants appropriés, par exemple un client souhaite qu'une entrée XML soit comprise par le serveur. Le serveur doit alors avoir des dépendances liées à XML.
à surmonter 415 - comprendre les types de support pris en charge par le serveur et passer le type de support correct dans l'en-tête de type de contenu de la demande
C'est peut-être parce que vous n'avez pas spécifié de chemin pour la fonction API. Vous avez uniquement spécifié le chemin de la ressource dans votre code.
@POST
@Path("/somepath")
@Consumes(MediaType.APPLICATION_JSON)
public Response readData (Song song) {
...
}