Como obter acesso às informações do cabeçalho HTTP no controlador Spring MVC REST?

154

Eu sou novo na programação da web em geral, especialmente em Java, então aprendi o que é um cabeçalho e um corpo.

Estou escrevendo serviços RESTful usando o Spring MVC. Eu sou capaz de criar serviços simples com o @RequestMappingem meus controladores. Preciso de ajuda para entender como obter informações do cabeçalho HTTP de uma solicitação que vem ao meu método no meu controlador de serviço REST. Gostaria de analisar o cabeçalho e obter alguns atributos dele.

Você poderia explicar como faço para obter essas informações?

Horse Voice
fonte

Respostas:

264

Quando você anota um parâmetro com @RequestHeader, o parâmetro recupera as informações do cabeçalho. Então você pode fazer algo assim:

@RequestHeader("Accept")

para obter o Acceptcabeçalho.

Portanto, a partir da documentação :

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

}

Os valores Accept-Encodinge Keep-Alivecabeçalho são fornecidos nos parâmetros encodinge, keepAliverespectivamente.

E não se preocupe. Somos todos noobs com alguma coisa.

Vidya
fonte
Obrigado. Em alguns exemplos de código da empresa em que trabalho, vejo HttpServletRequest como o parâmetro e existe um método getHeader. Qual abordagem é preferível?
Voz Cavalo
1
Prefira abstrações aos detalhes de baixo nível de uma API. Prefiro que o Spring MVC abstraia os detalhes da ServletAPI. Posso usar as anotações para extrair o que preciso da solicitação.
Vidya
6
Você deve mencionar, você receberá um erro de 400 solicitações incorretas como resposta, caso a solicitação não contenha esse cabeçalho. Forma mais flexível é o acesso direto a cabeçalhos de solicitação conforme descrito em: stackoverflow.com/a/28209710/1828296
lospejos
Eu acho que depende do que você quer fazer, mas uma resposta de 400 é o comportamento que eu quase sempre desejaria nesse caso.
Vidya
@lospejos que podem ser evitados usando a requiredflag assim @RequestHeader(name = "Keep-Alive", required = false) long keepAlivedefinirão o keepAlive como null se não for fornecido. Também existe um defaultValuecampo para a anotação docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/…
Niccolò
88

Você pode usar a @RequestHeaderanotação com o HttpHeadersparâmetro method para obter acesso a todos os cabeçalhos da solicitação:

@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
fonte
E o corpo da solicitação http? Como acesso as informações específicas do cabeçalho? você poderia me explicar se o HttpHeaders é um mapa que eu preciso de uma chave para acessar?
Horse Voice
HttpHeaders tem getters para obter os detalhes do cabeçalho. você pode explorar este link para obter os detalhes: docs.spring.io/spring/docs/3.1.x/javadoc-api/org/...
Debojit Saikia
editei minha resposta para mostrar como você pode obter acesso ao corpo da solicitação.
Debojit Saikia
1
Por que o streamsource é necessário? Parece muito complicado. Deve haver uma maneira mais fácil do que usar fluxos etc.
Horse Voice: '
Aqui StringReaderé usado para ler o fluxo de caracteres recebidos. StreamSourcefunciona como um detentor de uma fonte de transformação na forma de um fluxo de marcação XML.
Debojit Saikia
14

Minha solução nos parâmetros do cabeçalho com o exemplo é user = "test" é:

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

System.out.println(headers.get("user"));
}
Armando Cordova
fonte