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

}

140voto

Anup Awasthi Points 1409

Ajouter Content-Type: application/json y Accept: application/json dans la section d'en-tête du client REST

21voto

unludo Points 1673

Le problème se situe au niveau de la désérialisation du bean Customer. Votre programme sait comment le faire en XML, avec JAXB comme l'écrit Daniel, mais ne sait probablement pas comment le faire en JSON.

Voici un exemple avec Resteasy/Jackson http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

Il en va de même pour Jersey : http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

17voto

Max P Magee Points 101

Au cas où cela pourrait être utile à d'autres, voici mon anecdote :

J'ai trouvé ce fil de discussion suite à un problème que j'ai rencontré alors que j'utilisais Postman pour envoyer des données de test à mon serveur RESTEasy, où - après une modification importante du code - je n'obtenais rien d'autre que des erreurs 415 Unsupported Media Type (type de média non pris en charge).

Pour faire court, j'ai tout arraché, puis j'ai essayé d'exécuter l'exemple trivial de téléchargement de fichiers dont je savais qu'il fonctionnait ; il n'a pas fonctionné. C'est alors que j'ai réalisé que le problème venait de ma requête Postman. Normalement, je n'envoie pas d'en-têtes spéciaux, mais lors d'un test précédent, j'avais ajouté un en-tête "Content-Type" : "application/json". Bien sûr, j'essayais de télécharger du "multipart/form-data". En le supprimant, j'ai résolu mon problème.

Moralité : vérifiez vos en-têtes avant de faire exploser votre monde ;)

3voto

David Hopkins Points 103

J'ai eu ce problème et j'ai découvert que le problème venait du fait que je n'avais pas enregistré la classe JacksonFeature :

// Create JAX-RS application.
final Application application = new ResourceConfig()
    ...
    .register(JacksonFeature.class);

Sans cela, votre application ne sait pas comment convertir le JSON en un objet Java.

https://jersey.java.net/documentation/latest/media.html#json.jackson

1voto

User9527 Points 2623

J'ai eu le même problème :

curl -v -H "Content-Type : application/json" -X PUT -d '{"name" : "json", "surname" : "gson", "married":true, "age":32, "salary":123, "hasCar":true, "childs" :["serkan", "volkan", "aybars"]}' XXXXXX/ponyo/UserModel/json

* About to connect() to localhost port 8081 (#0)
*   Trying ::1...
* Connection refused
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 8081 (#0)
> PUT /ponyo/UserModel/json HTTP/1.1
> User-Agent: curl/7.28.1
> Host: localhost:8081
> Accept: */*
> Content-Type: application/json
> Content-Length: 121
> 
* upload completely sent off: 121 out of 121 bytes
< HTTP/1.1 415 Unsupported Media Type
< Content-Type: text/html; charset=iso-8859-1
< Date: Wed, 09 Apr 2014 13:55:43 GMT
< Content-Length: 0
< 
* Connection #0 to host localhost left intact
* Closing connection #0

J'ai résolu le problème en ajoutant la dépendance à pom.xml comme suit. Veuillez l'essayer.

    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>0.98</version>
    </dependency>

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