¿Cómo obtener acceso a la información del encabezado HTTP en el controlador Spring MVC REST?

154

Soy nuevo en la programación web en general, especialmente en Java, así que aprendí qué es un encabezado y un cuerpo.

Estoy escribiendo servicios RESTful usando Spring MVC. Puedo crear servicios simples con @RequestMappingmis controladores. Necesito ayuda para comprender cómo obtener información de encabezado HTTP de una solicitud que llega a mi método en mi controlador de servicio REST. Me gustaría analizar el encabezado y obtener algunos atributos de él.

¿Podría explicar cómo hago para obtener esa información?

Voz de caballo
fuente

Respuestas:

264

Cuando anota un parámetro con @RequestHeader, el parámetro recupera la información del encabezado. Entonces puedes hacer algo como esto:

@RequestHeader("Accept")

para obtener el Acceptencabezado.

Entonces de la documentación :

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

}

Los valores de encabezado Accept-Encodingy Keep-Alivese proporcionan en los parámetros encodingy keepAliverespectivamente.

Y no te preocupes. Todos somos novatos con algo.

Vidya
fuente
Gracias. En algunos ejemplos de código en la empresa para la que trabajo, veo HttpServletRequest como parámetro y hay un método getHeader en él. ¿Qué enfoque es preferible?
Horse Voice
1
Prefiere abstracciones a los detalles de bajo nivel de una API. Preferiría que Spring MVC abstraiga los detalles de la ServletAPI. Puedo usar las anotaciones para extraer lo que necesito de la solicitud.
Vidya
66
Debería mencionar que recibirá un error de solicitud incorrecta 400 como respuesta en caso de que la solicitud no contenga dicho encabezado. Una forma más flexible es el acceso directo a los encabezados de solicitud como se describe en: stackoverflow.com/a/28209710/1828296
lospejos
Supongo que depende de lo que quieras hacer, pero una respuesta 400 es el comportamiento que casi siempre quisiera en ese caso.
Vidya
@lospejos que se pueden evitar mediante el uso de la requiredbandera como @RequestHeader(name = "Keep-Alive", required = false) long keepAliveesa establecerá el keepAlive en nulo si no se proporciona. También hay un defaultValuecampo para la anotación docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/…
Niccolò
88

Puede usar la @RequestHeaderanotación con el HttpHeadersparámetro método para obtener acceso a todos los encabezados de solicitud:

@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
fuente
¿Qué pasa con el cuerpo de la solicitud http? ¿Cómo accedo a los detalles del encabezado? ¿podría explicarme si HttpHeaders es un mapa al que necesito una clave para acceder?
Horse Voice
HttpHeaders tiene captadores para obtener los detalles del encabezado. puede explorar este enlace para obtener los detalles: docs.spring.io/spring/docs/3.1.x/javadoc-api/org/…
Debojit Saikia
edité mi respuesta para mostrar cómo puede obtener acceso al cuerpo de la solicitud.
Debojit Saikia
1
¿Por qué se necesita streamsource? Parece muy complicado Debe haber una manera más fácil que usar transmisiones, etc.
Horse Voice
Aquí StringReaderse utiliza para leer la secuencia de caracteres entrantes. StreamSourcefunciona como titular de una fuente de transformación en forma de una secuencia de marcado XML.
Debojit Saikia
14

Mi solución en los parámetros del encabezado con ejemplo es user = "test" es:

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

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