2015-06-18 12 views
8

Uczę się, jak budować RESTful usług internetowych przy użyciu Spring 4, a jedno nie jestem jasne na jest w @ RequestMapping. Widziałem przykłady, gdzie jeden używa headers = "Accept=application/xml" i innych przykładów przy użyciu spożywa (lub produkuje) = "application/xml".Spring 4 @RequestMapping - zużywa kontra nagłówki?

Na przykład, w moim klasy @RestController mam tej funkcji ...

// POST 
@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/xml") 
public User create(@RequestBody User user) { 
    LOG.info("User = " + user.toString()); 
return userService.create(user); 
} 

Jaka jest różnica między używaniem headers = "Accept=application/xml" Vs. korzystając zużywa = "application/xml"? lub nawet za pomocą headers = "content-type=application/xml"?

Czy ktoś mógłby wyjaśnić różnice między nagłówkami i zużyciem/produkcją, a kiedy każdy z nich jest używany?

Odpowiedz

1

Jako javadoc z HeadersRequestCondition (która zajmuje się wartość podaną w atrybucie headers z @RequestMapping adnotacji) stwierdza

wyrażeń przekazany do konstruktora z nazw nagłówków „Zaakceptuj” lub „Content-Type” zostaną ignorowane. Zobacz ConsumesRequestCondition i ProducesRequestCondition dla nich.

Więc nie używaj tych nagłówków w headers. Użyj atrybutów produces i consumes dla Accept i i .

Dokumentacja zawierająca przykłady użycia: for consumes i for produces.

+0

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. –

+0

@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). –

+0

@VadimKirilchuk Również cytat w odpowiedzi pochodzi z javadoc. –

23

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.

+1

Ta odpowiedź powinna być oznaczona jako odpowiedź akceptacji. przy okazji dziękuję Alex za szczegółową i wyczerpującą odpowiedź. –

+0

Każdy pomysł, dlaczego [to nie działa] (http://stackoverflow.com/questions/42044639/file-upload-wontwork)? – displayname

Powiązane problemy