Ho un semplice controller REST scritto in un'applicazione Spring-boot ma non sono sicuro di come implementare la negoziazione del contenuto per farlo restituire JSON o XML in base al parametro Content-Type nell'intestazione della richiesta . Qualcuno potrebbe spiegarmi cosa sto sbagliando?Negoziazione del contenuto del controller di avvio Spring
metodo di controllo:
@RequestMapping(value = "/message", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
public Message getMessageXML(@RequestParam("text") String text) throws Exception {
Message message = new Message();
message.setDate(new Date());
message.setName("Test");
message.setAge(99);
message.setMessage(text);
return message;
}
ottengo sempre JSON quando si chiama questo metodo (anche se a specificare la Content-Type
essere application/xml
o text/xml
).
Quando implemento due metodi ciascuno con mappature e tipi di contenuto diversi, sono in grado di ottenere XML da quello xml ma non funziona se si specificano due mediaTypes in un unico metodo (come nell'esempio fornito).
Quello che vorrei è quello di chiamare il \message
endpoint e ricevere
- XML quando il Content-Type della richiesta GET è impostato su application/xml
- JSON quando il Content-Type è application/json
Qualsiasi aiuto è apprezzato.
EDIT: ho aggiornato il mio controller di accettare tutti i tipi di media
@RequestMapping(value = "/message", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE }, consumes = MediaType.ALL_VALUE)
public Message getMessageXML(@RequestParam("text") String text) throws Exception {
Message message = new Message();
message.setDate(new Date());
message.setName("Vladimir");
message.setAge(35);
message.setMessage(text);
return message;
}
È necessario fornire un'intestazione 'Accept' con il valore' application/xml' o con qualsiasi tipo di supporto supportato. – systemfreund
L'intestazione "Content-Type" definisce il tipo di contenuto che stai inviando, non quello che vuoi ricevere (questo è l'intestazione "Accept".) Quindi l'intestazione "Content-Type" per una richiesta GET non lo fa t ha senso, dato che non può avere alcun contenuto (corpo) Quindi nel tuo caso dovresti usare l'intestazione "Accetta" per la tua richiesta e nella risposta l'intestazione "Content-Type" per nominare il tipo di contenuto che è in effetti invia –