krótka odpowiedź
W przykładzie masz powyżej, stosując headers = "Accept=application/xml"
lub produces = "application/xml"
będzie odpowiadać zarówno do klienta w ten sam sposób tj wysłać odpowiedź do klienta z reprezentacją XML.
Dłuższa odpowiedź
ja. Nagłówki:
W przypadku usług sieci Web RESTful klient (na przykład Twoja przeglądarka) wysyła żądanie (na przykład GET, POST itp.) Do serwera, a serwer wyśle odpowiedź z powrotem. To jest transakcja HTTP. Zarówno żądanie, jak i odpowiedź mają pola nagłówka HTTP ("nagłówki"), które definiują parametry operacyjne transakcji HTTP (odnoszę się do nagłówków dla żądania klienta jako "nagłówków żądań", a różnią się one od nagłówków odpowiedzi odpowiedzi serwera nagłówki ").
Jako część żądania przeglądarka wysyła do serwera, istnieją różne nagłówki żądania, a niektóre przykłady obejmują Accept
, Connection
, Content-Length
itd., A każdy z tych nagłówków mają własne funkcje (zobacz pełną listę nagłówków tutaj: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields).
Korzystanie przykład kodu, jeśli klient ma żądania POST, Wiosna sprawdzi nagłówka żądania (-y) i jeśli znajdzie nagłówek Accept
o wartości application/xml
będzie mapować żądania do sposobu create
masz powyżej (aw twoim przypadku serwer zwróci reprezentację odpowiedzi XML do klienta).
Pozwól modyfikować element headers
w kodzie, który podałeś:
@RequestMapping(method = RequestMethod.POST, headers = "Connection=keep-alive")
public User create(@RequestBody User user) {
...
}
Wskazówka element headers
ma teraz wartość Connection=keep-alive
. Jeśli klient wykonuje żądanie POST, Spring sprawdzi nagłówek (żądania) i jeśli znajdzie nagłówek Connection
o wartości keep-alive
, zamapuje to żądanie klienta do powyższej metody create
.
ii. Produkuje i konsumuje
Jeśli użyto produces="application/xml"
dla metody create
oznacza to żądanie klienta jest mapowany jedynie metody create
jeśli Accept
nagłówek klienta pasuje application/xml
. Zasadniczo klient mówi: "Hej, serwer, wolę przyjąć twoją odpowiedź w reprezentacji XML, więc wyślij mi odpowiedź w XML". W efekcie, produces="application/xml"
jest również serwerem, który mówi: "Hej, klient, mogę tylko tworzyć odpowiedzi dla ciebie w reprezentacji XML, więc wyślę ci ten format". Link to Spring documentation reference.
Jeśli użyto consumes="application/xml"
dla metody create
oznacza to żądanie klienta jest mapowany jedynie metody create
jeśli Content-Type
nagłówek klienta pasuje application/xml
(nagłówek Content-Type
prośba opisuje reprezentację żądanie klienta najbliższych). Zasadniczo jest to serwer, który mówi: "Hej, klient, mogę tylko zużywać żądania w reprezentacji XML, więc wyślij mi ten format".
STRESZCZENIE
Element headers
w @RequestMapping
adnotacji może przybierać różne nagłówki żądania (Accept
, Connection
, Cache-Control
itd.), Ale element produces
dotyczy jedynie nagłówku Accept
żądanie i elementu consumes
jest tylko zaniepokojony z nagłówkiem żądania Content-Type
.
Nie sądzę, że jest to ignorowane, nie ma w tym nic w oficjalnej dokumentacji. Co więcej, działa. W każdym razie preferowane jest używanie produków i konsumpcji. –
@VadimKirilchuk Są one ignorowane w 'HeadersRequestCondition'. Zobacz kod źródłowy, [tutaj] (https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition /HeadersRequestCondition.java#L65). Jednak te same wartości są również przekazywane do 'ProducesRequestCondition' i' ConsumesRequestCondition' podczas budowania 'RequestMappingInfo' dla' RequestMappingHandlerMapping'. Zobacz [tutaj] (http://stackoverflow.com/questions/34138501/java-illegalstateexception-on-http-response#34138501). –
@VadimKirilchuk Również cytat w odpowiedzi pochodzi z javadoc. –