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?

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.


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);
    // ...
}

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"));
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.