83 votes

Erreur 415 Type de support non pris en charge : POST n'atteint pas REST si JSON, mais l'atteint si XML

Je suis en fait novice en matière de REST WS, mais je ne comprends vraiment pas ce qui suit 415 Unsupported Media Type .

Je teste mon REST avec Poster sur Firefox et l'option GET fonctionne bien pour moi, de même que l'option POST (lorsqu'il s'agit d'un application/xml ) mais lorsque j'essaie application/json il n'atteint pas du tout le WS, le serveur le rejette.

Voici mon URL : http:// localhost:8081/RestDemo/services/clients/add

Il s'agit de JSON J'envoie : {"name": "test1", "address" :"test2"}

Il s'agit de XML J'envoie :

<customer>
    <name>test1</name>
    <address>test2</address>
</customer>

et voici ma classe de ressources :

@Produces("application/xml")
@Path("customers")
@Singleton
@XmlRootElement(name = "customers")
public class CustomerResource {

    private TreeMap<Integer, Customer> customerMap = new TreeMap<Integer, Customer>();

    public  CustomerResource() {
        // hardcode a single customer into the database for demonstration
        // purposes
        Customer customer = new Customer();
        customer.setName("Harold Abernathy");
        customer.setAddress("Sheffield, UK");
        addCustomer(customer);
    }

    @GET
    @XmlElement(name = "customer")
    public List<Customer> getCustomers() {
        List<Customer> customers = new ArrayList<Customer>();
        customers.addAll(customerMap.values());
        return customers;
    }

    @GET
    @Path("/{id}")
    @Produces("application/json")
    public String getCustomer(@PathParam("id") int cId) {
        Customer customer = customerMap.get(cId); 
        return  "{\"name\": \" " + customer.getName() + " \", \"address\": \"" + customer.getAddress() + "\"}";

    }

    @POST
    @Path("/add")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public String addCustomer(Customer customer) {
         //insert 
         int id = customerMap.size();
         customer.setId(id);
         customerMap.put(id, customer);
         //get inserted
         Customer result = customerMap.get(id);

         return  "{\"id\": \" " + result.getId() + " \", \"name\": \" " + result.getName() + " \", \"address\": \"" + result.getAddress() + "\"}";
    }

}

EDIT 1 :

Il s'agit de ma classe de clients :

@XmlRootElement 
public class Customer implements Serializable {

    private int id;
    private String name;
    private String address;

    public Customer() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

1voto

Bertrand Points 43

J'ai le même problème. En fait, la requête n'a pas atteint la méthode jersey annotée. J'ai résolu le problème en ajoutant l'annotation : @Consumes(MediaType.APPLICATION_FORM_URLENCODED) L'annotation @Consumes(" / ") ne fonctionnent pas !

    @Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH)
    @POST
    //@Consumes("*/*")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void  get__EstNouvelleGH( @Context HttpServletResponse response) {
        ...
    }

0voto

Daniel Kutik Points 4188

Ne renvoyez pas de chaînes dans vos méthodes mais des objets clients et laissez JAXB s'occuper de la dé/sérialisation.

0voto

Prakhar Agrawal Points 54

J'ai eu le même problème, car il donnait error-415-unsupported-media-type en appuyant sur post call en utilisant json alors que j'avais déjà le fichier

@Consumes(MediaType.APPLICATION_JSON) 

et les en-têtes de requête comme dans mon service web reposant (restful) utilisant Jersey 2.0+.

Accept:application/json
Content-Type:application/json

J'ai résolu ce problème en ajoutant les dépendances suivantes à mon projet

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>

Cela ajoutera les bocaux suivants à votre bibliothèque :

  1. jersey-media-json-jackson-2.25.jar
  2. jersey-entity-filtering-2.25.jar
  3. jackson-module-jaxb-annotations-2.8.4.jar
  4. jackson-jaxrs-json-provider-2.8.4.jar
  5. jackson-jaxrs-base-2.8.4.jar

J'espère qu'il fonctionnera pour d'autres comme il l'a fait pour moi.

0voto

Chirag Points 161

Changez simplement le type de contenu en application/json lorsque vous utilisez JSON avec POST/PUT, etc...

0voto

swati shilpa Points 1

Dans le cas où vous essayez d'utiliser l'application ARC de Google et de poster un XML et que vous obtenez cette erreur, essayez de changer le type de contenu du corps en application/xml . Exemple ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X