Jak uzyskać dostęp do informacji z nagłówka HTTP w kontrolerze Spring MVC REST?

154

Jestem nowy w programowaniu internetowym w ogóle, zwłaszcza w Javie, więc właśnie dowiedziałem się, czym jest nagłówek i treść.

Piszę usługi RESTful przy użyciu Spring MVC. Jestem w stanie tworzyć proste usługi za pomocą @RequestMappingmoich kontrolerów. Potrzebuję pomocy w zrozumieniu, jak uzyskać informacje nagłówka HTTP z żądania przychodzącego do mojej metody w kontrolerze usługi REST. Chciałbym przeanalizować nagłówek i pobrać z niego kilka atrybutów.

Czy mógłbyś wyjaśnić, jak mam zdobyć te informacje?

Głos konia
źródło

Odpowiedzi:

264

Kiedy dodajesz adnotację do parametru @RequestHeader, parametr pobiera informacje z nagłówka. Możesz więc po prostu zrobić coś takiego:

@RequestHeader("Accept")

aby uzyskać Acceptnagłówek.

A więc z dokumentacji :

@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
                              @RequestHeader("Keep-Alive") long keepAlive)  {

}

Wartości nagłówka Accept-Encodingi Keep-Alivesą podane odpowiednio w parametrach encodingi keepAlive.

I nie martw się. Wszyscy jesteśmy z czymś noobami.

Vidya
źródło
Dziękuję Ci. W niektórych przykładach kodu w firmie, dla której pracuję, widzę HttpServletRequest jako parametr i jest na nim metoda getHeader. Które podejście jest lepsze?
Horse Voice
1
Preferuj abstrakcje od niskopoziomowych szczegółów interfejsu API. O wiele bardziej wolałbym, aby Spring MVC wyodrębnił szczegóły Servletinterfejsu API. Mogę użyć adnotacji, aby wyciągnąć z żądania to, czego potrzebuję.
Vidya
6
Powinienem wspomnieć, otrzymasz błąd 400 złego żądania jako odpowiedź na wypadek, gdyby żądanie nie zawierało takiego nagłówka. Bardziej elastycznym sposobem jest bezpośredni dostęp do nagłówków żądania, jak opisano w: stackoverflow.com/a/28209710/1828296
lospejos
Myślę, że zależy to od tego, co chcesz zrobić, ale odpowiedź 400 to zachowanie, którego prawie zawsze chciałbym w takim przypadku.
Vidya
@lospejos, którego można uniknąć, używając takiej requiredflagi @RequestHeader(name = "Keep-Alive", required = false) long keepAlive, ustawi parametr keepAlive na null, jeśli nie zostanie podany. Jest też defaultValuepole na adnotację docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/ ...
Niccolò
88

Możesz użyć @RequestHeaderadnotacji z HttpHeadersparametrem metody, aby uzyskać dostęp do wszystkich nagłówków żądań:

@RequestMapping(value = "/restURL")
public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
    // Use headers to get the information about all the request headers
    long contentLength = headers.getContentLength();
    // ...
    StreamSource source = new StreamSource(new StringReader(body));
    YourObject obj = (YourObject) jaxb2Mashaller.unmarshal(source);
    // ...
}
Debojit Saikia
źródło
A co z treścią żądania http? Jak uzyskać dostęp do szczegółów nagłówka? czy możesz mi wyjaśnić, czy HttpHeaders to mapa, do której potrzebuję klucza?
Horse Voice
HttpHeaders ma metody pobierające, aby uzyskać informacje o nagłówku. możesz skorzystać z tego linku, aby uzyskać szczegółowe informacje: docs.spring.io/spring/docs/3.1.x/javadoc-api/org/…
Debojit Saikia
zredagował moją odpowiedź, aby pokazać, jak możesz uzyskać dostęp do treści żądania.
Debojit Saikia
1
Dlaczego potrzebne jest źródło strumieniowe? Wydaje się to zbyt skomplikowane. Musi być łatwiejszy sposób niż używanie strumieni itp.
Horse Voice
Tutaj StringReadersłuży do odczytywania przychodzącego strumienia znaków. StreamSourcedziała jako uchwyt na źródło transformacji w postaci strumienia znaczników XML.
Debojit Saikia
14

Moje rozwiązanie w parametrach nagłówka z przykładem to user = "test" to:

@RequestMapping(value = "/restURL")
  public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers){

System.out.println(headers.get("user"));
}
Armando Cordova
źródło