web-dev-qa-db-fra.com

REST Webservice retournant 415 - Type de média non pris en charge

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:

enter image description here

Lorsque je l’envoie, le message 415 Type de support non supporté apparaît. Quelqu'un a une idée pourquoi?

13
Tiwaz89

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.

35
lefloh

Comme d'autres l'ont souligné, il vous manque le bon en-tête. Ajoutez Content-Type: application/json aux "en-têtes": enter image description here

7
grepit

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 ...

3
Fabiano Tarlao

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 {
0
Iain T

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

0
Hasnaa Ibraheem

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

0
Kapil Reddy

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) {
  ...
}
0
user3811473