java - statuscode - unsupported media type react
Error 415 Tipo de soporte no soportado: POST no llega a REST si es JSON, pero si XML (7)
Agregar Content-Type: application/json
y Accept: application/json
en la sección REST Client header
En realidad, soy nuevo en REST WS, pero realmente no obtengo este 415 Unsupported Media Type
.
Estoy probando mi REST con Poster on Firefox y el GET
funciona bien para mí, también el POST
(cuando es una application/xml
) pero cuando pruebo application/json
no llega al WS, el servidor lo rechaza .
Esta es mi URL: http: // localhost: 8081 / RestDemo / services / customers / add
Esto es JSON
que estoy enviando: {"name": "test1", "address" :"test2"}
Esto es XML
que estoy enviando:
<customer>
<name>test1</name>
<address>test2</address>
</customer>
y esta es mi clase de Recursos:
@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:
Esta es mi clase de Cliente:
@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;
}
}
El problema está en la deserialización del cliente de frijol. Sus programas saben cómo hacerlo en XML, con JAXB como Daniel está escribiendo, pero lo más probable es que no sepa cómo hacerlo en JSON.
Aquí tiene un ejemplo con Resteasy / Jackson http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/
Lo mismo con Jersey: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/
En caso de que esto sea útil para otros, aquí está mi anécdota:
Encontré este hilo como resultado de un problema que encontré mientras usaba Postman para enviar datos de prueba a mi servidor RESTEasy, donde después de un cambio significativo de código, recibí solo 415 errores de tipos de medios no admitidos.
En resumen, deshice todo, eventualmente intenté ejecutar el ejemplo trivial de carga de archivos que sabía que funcionó; no fue así Fue entonces cuando me di cuenta de que el problema era con mi solicitud de cartero. Normalmente no envío ningún encabezado especial, pero en una prueba anterior agregué un encabezado "Content-Type": "application / json". POR SUPUESTO, estaba intentando subir "multipart / form-data". Eliminarlo resolvió mi problema.
Moraleja: revisa tus encabezados antes de explotar tu mundo. ;)
No devuelva cadenas en sus métodos, pero el Cliente se opone a sí mismo y deje que JAXB se encargue de la de / serialización.
Tengo el mismo problema. De hecho, la solicitud no llegó al método anotado jersey. Resolví el problema con agregar la anotación: @Consumes (MediaType.APPLICATION_FORM_URLENCODED) ¡La anotación @Consumes (" / ") no funciona!
@Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH)
@POST
//@Consumes("*/*")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void get__EstNouvelleGH( @Context HttpServletResponse response) {
...
}
Tuve este problema y descubrí que el problema era que no había registrado la clase JacksonFeature:
// Create JAX-RS application.
final Application application = new ResourceConfig()
...
.register(JacksonFeature.class);
Sin hacer esto, su aplicación no sabe cómo convertir el JSON en un objeto java.
https://jersey.java.net/documentation/latest/media.html#json.jackson
Yo tuve el mismo problema:
curl -v -H "Content-Type: application / json" -X PUT -d ''{"name": "json", "apellido": "gson", "casado": verdadero, "edad": 32, " salario ": 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
Lo resolví agregando la dependencia a pom.xml de la siguiente manera. Por favor pruebalo.
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.98</version>
</dependency>