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;
    }

}

0voto

Harish Points 1

J'ai rencontré le même problème dans postman, je sélectionnais Accept dans la section header et fournissais la valeur "application/json". J'ai donc décoché et sélectionné Content-Type et fourni la valeur "application/json". Cela a fonctionné !

0voto

amrit Points 733

Si aucune de ces solutions n'a fonctionné et que vous travaillez avec JAXB, vous devez annoter votre classe avec la mention @XmlRootElement pour éviter 415 unsupported media type

-1voto

Phanindra Nath Points 41

J'ai eu le même problème en utilisant postman. Pour la requête POST, dans la section des en-têtes, ajoutez les éléments suivants

key:valuepair

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

J'espère que cela fonctionnera.

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