2012-08-02 15 views
56

Sono davvero nuovo per REST WS ma in realtà non ottengo questo 415 Unsupported Media Type.Errore 415 Tipo di supporto non supportato: POST non raggiunge REST se JSON, ma lo fa se XML

sto testando il mio riposo con poster su Firefox e il GET funziona bene per me, anche il POST (quando è un application/xml), ma quando provo application/json non non raggiunge il WS a tutti, il server rifiuta esso .

Questo è il mio URL: http: // localhost: 8081/RestDemo/servizi/clienti/aggiungere

Questo è JSON Mando: {"name": "test1", "address" :"test2"}

Questo è XML Mando:

<customer> 
    <name>test1</name> 
    <address>test2</address> 
</customer> 

e questa è la mia classe di risorse:

@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:

Questa è la mia classe 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; 
    } 

} 
+0

Come è la tua classe 'Cliente'? Quali annotazioni JAXB usi su di esso? –

+0

Grazie, ho aggiornato il codice con la mia classe Cliente. – mzereba

risposta

17

Il problema è nella deserializzazione del bean Customer. I tuoi programmi sanno come farlo in XML, con JAXB come Daniel sta scrivendo, ma molto probabilmente non sa come farlo in JSON.

Ecco un esempio con Resteasy/Jackson http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

Lo stesso con Jersey: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

+1

In questi esempi l'input è esattamente uguale al mio, il ritorno è diverso (come ha detto Daniel) ma il mio problema è avanti e non sto affatto toccando la classe. – mzereba

+0

@Maged usi resteasy o jersey? – unludo

+0

jersey in realtà ... – mzereba

0

Non restituiscono stringhe nei vostri metodi, ma gli oggetti del cliente è di per sé e lasciare JAXB prendersi cura della de/serializzazione.

+2

Potrebbe essere ma penso che qui il problema sia avanti, non sto colpendo affatto il servizio. – mzereba

112

Aggiungi Content-Type: application/json e Accept: application/json nella sezione di intestazione client REST

+2

Dove si trova la sezione dell'intestazione del client REST? – tamuren

+1

se si utilizza la chiamata curl dalla riga di comando, è possibile aggiungere l'intestazione come segue: [$> curl -H "Content-Type: application/json" -X POST -d '{"nome": "my_name" , "password": "123456"} 'http: // localhost: 8080/url] –

+0

Hai bisogno del tuo aiuto, sono nuovo in questa creazione di API di riposo, dove si trova la sezione di intestazione del client EST? – Naveenbos

10

Solo nel caso che questo sia utile ad altri, ecco il mio aneddoto:

Ho trovato questa minaccia d come risultato di un problema che ho riscontrato mentre stavo usando Postman per inviare i dati di test al mio server RESTEasy, dove, dopo un significativo cambio di codice, non ricevevo altro che 415 errori di tipo di supporto non supportato.

Per farla breve, ho strappato tutto, alla fine ho cercato di eseguire l'esempio di caricamento di file banali che sapevo funzionasse; non è stato così. Fu allora che mi resi conto che il problema era con la mia richiesta Postman. Normalmente non invio intestazioni speciali, ma in un test precedente avevo aggiunto un "Content-Type": intestazione "application/json". DEL CORSO, stavo cercando di caricare "multipart/form-data". La rimozione ha risolto il mio problema.

Morale: controlla le intestazioni prima di far esplodere il tuo mondo.;)

+2

+1 per il consiglio di "assicurati che il tostapane sia collegato". Ho appena avuto lo stesso problema ed è facile trascurare quando sei convinto che il problema sia nel codice. –

+0

Hai salvato la mia giornata. – ZZzzZZzz

1

Ho avuto lo stesso problema:

ricciolo -v -H "Content-Type: application/json" -X PUT -d '{ "name": "json", "cognome" : "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 

ho risolto con l'aggiunta della dipendenza pom.xml come segue. Per favore provalo

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

ho avuto questo problema e ha scoperto che il problema era che non avevo registrato la classe JacksonFeature:

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

Senza fare questo l'applicazione non sapere come convertire il JSON per un oggetto Java .

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

+1

puoi spiegare un po 'di più? Ho quasi provato tutto e penso che mi manchi questo punto. dove dovrei fare questa registrazione? Grazie – Armen

+0

Grazie mille, ho riscontrato questo durante l'avvio di un server grizzly. Quando viene avviato da IDE o mvn: esegui tutto correttamente, ma non quando usi un jar con dipendenze. Hai fatto il mio giorno, signore! – Julien

0

ottengo lo stesso problema. In effetti, la richiesta non ha raggiunto il metodo della maglia annoted. Ho risolto il problema aggiungendo l'annotazione: @Consumes (MediaType.APPLICATION_FORM_URLENCODED) L'annotazione @Consumi ("/") non funziona!

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