web-dev-qa-db-fra.com

Erreur 415 Type de support non pris en charge: POST ne pas atteindre REST si JSON, mais si XML

En réalité, je suis nouveau sur REST WS mais je n’ai pas ce 415 Unsupported Media Type

Je teste mon REST avec Poster sur Firefox et la GET fonctionne très bien pour moi, également la POST (quand il s'agit d'un application/xml), mais lorsque j'essaie application/json, le serveur ne la rejette pas du tout .

Ceci est mon URL: http: // localhost: 8081/RestDemo/services/clients/add

Ceci est JSON J'envoie: {"name": "test1", "address" :"test2"}

Ceci est 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:

Ceci est ma classe de client:

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

}
65
mzereba

Le problème réside dans la désérialisation du bean Customer. Vos programmes savent comment le faire en XML, avec JAXB comme l'écrit Daniel, mais ne savent probablement pas le faire en JSON.

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

Même chose pour Jersey: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

20
unludo

Ajouter Content-Type: application/json et Accept: application/jsonin REST Section d'en-tête du client

121
Anup Awasthi

Juste au cas où cela serait utile aux autres, voici mon anecdote:

J'ai trouvé ce fil à la suite d'un problème rencontré alors que j'utilisais Postman pour envoyer des données de test à mon serveur RESTEasy. Après un changement de code important, je ne recevais que 415 erreurs de type de support non prises en charge.

Pour résumer, j'ai tout arraché et j'ai finalement essayé d'exécuter l'exemple trivial de téléchargement de fichier dont je savais qu'il fonctionnait. ça n'a pas. C'est alors que j'ai réalisé que le problème venait de ma demande de postier. 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 "multipart/form-data". Le supprimer a résolu mon problème.

Morale: Vérifiez vos en-têtes avant de faire sauter votre monde. ;)

13
Max P Magee

J'avais ce problème et j'ai constaté que le problème était 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 convertir le JSON en objet Java. 

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

3
David Hopkins

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

curl -v -H "Type de contenu: application/json" -X PUT -d '{"nom": "json", "nom de famille": "gson", "marié": vrai, "âge": 32 ans " traitement ": 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

Je l'ai résolu en ajoutant la dépendance à pom.xml comme suit. Essayez-le. 

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

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

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

Ne renvoyez pas de chaînes dans vos méthodes, mais le client s’objecte lui-même et laisse JAXB se charger de la dé/sérialisation.

0
Daniel Kutik

Si vous essayez d'utiliser l'application ARC de Google et que vous publiez une XML et que vous obtenez cette erreur, essayez de remplacer le type de contenu du corps par application/xml. Exemple ici

0
swati shilpa

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

0
Chirag

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 

@Consumes(MediaType.APPLICATION_JSON) 

et demander des en-têtes comme dans mon service Web reposant avec 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>

ceci ajoutera les pots 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 que cela fonctionnera pour les autres aussi, comme cela a été le cas pour moi.

0
Prakhar Agrawal