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;
}
}
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/
Ajouter Content-Type: application/json
et Accept: application/json
in REST Section d'en-tête du client
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. ;)
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
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>
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) {
...
}
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.
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
changez simplement le type de contenu en application/json lorsque vous utilisez JSON avec POST/PUT, etc.
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:
J'espère que cela fonctionnera pour les autres aussi, comme cela a été le cas pour moi.