Mam prosty kontroler REST napisany w aplikacji Spring-boot, ale nie jestem pewien, jak zaimplementować negocjację treści, aby zwrócić JSON lub XML na podstawie parametru Content-Type w nagłówku żądania . Czy ktoś mógłby mi wytłumaczyć, co robię źle?Negocjacja zawartości kontrolera rozruchowego
metoda Kontroler:
@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;
}
zawsze dotrzesz JSON gdy wywołanie tej metody (nawet jeśli określić Content-Type
być application/xml
lub text/xml
).
Kiedy zaimplementuję dwie metody, z których każda ma inne odwzorowanie i inny typ zawartości, mogę uzyskać XML z xml, ale nie działa, jeśli określę dwa mediaType w jednej metodzie (jak w podanym przykładzie).
Co chciałbym to nazwać punkt końcowy \message
i odbierać
- XML gdy Content-Type żądania GET jest ustawione na application/xml
- JSON gdy Content-Type jest application/json
Każda pomoc jest doceniana.
EDIT: zaktualizowałem moją kontroler przyjąć wszystkie typy nośników
@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;
}
Musisz podać nagłówek 'Accept' z wartością' application/xml' lub z dowolnym obsługiwanym typem mediów. – systemfreund
Nagłówek "Content-Type" określa, jaki rodzaj wysyłanej treści nie jest wysyłany - nie dotyczy to nagłówka "Accept", więc użycie nagłówka "Content-Type" dla żądania GET " ma sens, ponieważ nie może mieć żadnej treści (ciała) Tak więc w twoim przypadku powinieneś użyć nagłówka "Accept" dla swojego żądania, a w odpowiedzi nagłówka "Content-Type", aby nazwać rodzaj treści, która jest właściwie wyślij: –