Saltar al contenido

Lectura de encabezados HTTP en un controlador REST de Spring

El paso a paso o código que encontrarás en este artículo es la solución más sencilla y válida que encontramos a esta inquietud o problema.

Solución:

El error que obtiene no parece estar relacionado con el RequestHeader.

Y parece que confunde los servicios Spring REST con JAX-RS, la firma de su método debería ser algo como:

@RequestMapping(produces = "application/json", method = RequestMethod.GET, value = "data")
@ResponseBody
public ResponseEntity getData(@RequestHeader(value="User-Agent") String userAgent, @RequestParam(value = "ID", defaultValue = "") String id) 
    // your code goes here

Y su clase REST debe tener anotaciones como:

@Controller
@RequestMapping("/rest/")

Con respecto a la pregunta real, otra forma de obtener encabezados HTTP es insertar el HttpServletRequest en su método y luego obtenga el encabezado deseado desde allí.

Ejemplo:

@RequestMapping(produces = "application/json", method = RequestMethod.GET, value = "data")
@ResponseBody
public ResponseEntity getData(HttpServletRequest request, @RequestParam(value = "ID", defaultValue = "") String id) 
    String userAgent = request.getHeader("user-agent");

No se preocupe por la inyección del HttpServletRequest porque Spring hace esa magia por ti;)

Les voy a dar un ejemplo de cómo leo los encabezados REST para mis controladores. Mis controladores solo aceptan application / json como un tipo de solicitud si tengo datos que deben leerse. Sospecho que su problema es que tiene una aplicación / flujo de octetos que Spring no sabe cómo manejar.

Normalmente, mis controladores se ven así:

@Controller
public class FooController {
    @Autowired
    private DataService dataService;

    @RequestMapping(value="/foo/", method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity getData(@RequestHeader String dataId)
        return ResponseEntity.newInstance(dataService.getData(dataId);
    

Ahora hay mucho código haciendo cosas en segundo plano aquí, así que lo desglosaré por ti.

ResponseEntity es un objeto personalizado que devuelve cada controlador. Contiene un static factoría que permite la creación de nuevas instancias. My Data Service es una clase de servicio estándar.

La magia ocurre detrás de escena, debido a que está trabajando con JSON, debe decirle a Spring que use Jackson para mapear objetos HttpRequest para que sepa con qué está lidiando.

Haz esto especificando esto dentro de tu bloque de tu configuración


    
        
            
        
    

ObjectMapper es simplemente una extensión de com.fasterxml.jackson.databind.ObjectMapper y es lo que Jackson usa para mapear su solicitud de JSON en un objeto.

Sospecho que está recibiendo su excepción porque no ha especificado un asignador que pueda leer un Octet-Stream en un objeto, o algo que Spring pueda manejar. Si está intentando cargar un archivo, eso es algo completamente diferente.

Entonces, mi solicitud que se envía a mi controlador se ve así, simplemente tiene un encabezado adicional llamado dataId.

Si desea cambiar eso a un parámetro de solicitud y usar @RequestParam String dataId para leer el ID de la solicitud, su solicitud se vería similar a esto:

contactId : "fooId" 

Este parámetro de solicitud puede ser tan complejo como desee. Puede serializar un objeto completo en JSON, enviarlo como un parámetro de solicitud y Spring lo serializará (usando Jackson) nuevamente en un Objeto Java listo para su uso.

Ejemplo en controlador:

@RequestMapping(value = "/penguin Details/", method = RequestMethod.GET)
@ResponseBody
public DataProcessingResponseDTO getPenguinDetailsFromList(
        @RequestParam DataProcessingRequestDTO jsonPenguinRequestDTO)

Solicitud enviada:

jsonPengiunRequestDTO: 
    "draw": 1,
    "columns": [
        
            "data": 
                "_": "toAddress",
                "header": "toAddress"
            ,
            "name": "toAddress",
            "searchable": true,
            "orderable": true,
            "search": 
                "value": "",
                "regex": false
            
        ,
        
            "data": 
                "_": "fromAddress",
                "header": "fromAddress"
            ,
            "name": "fromAddress",
            "searchable": true,
            "orderable": true,
            "search": 
                "value": "",
                "regex": false
            
        ,
        
            "data": 
                "_": "customerCampaignId",
                "header": "customerCampaignId"
            ,
            "name": "customerCampaignId",
            "searchable": true,
            "orderable": true,
            "search": 
                "value": "",
                "regex": false
            
        ,
        
            "data": 
                "_": "penguinId",
                "header": "penguinId"
            ,
            "name": "penguinId",
            "searchable": false,
            "orderable": true,
            "search": 
                "value": "",
                "regex": false
            
        ,
        
            "data": 
                "_": "validpenguin",
                "header": "validpenguin"
            ,
            "name": "validpenguin",
            "searchable": true,
            "orderable": true,
            "search": 
                "value": "",
                "regex": false
            
        ,
        
            "data": 
                "_": "",
                "header": ""
            ,
            "name": "",
            "searchable": false,
            "orderable": false,
            "search": 
                "value": "",
                "regex": false
            
        
    ],
    "order": [
        
            "column": 0,
            "dir": "asc"
        
    ],
    "start": 0,
    "length": 10,
    "search": 
        "value": "",
        "regex": false
    ,
    "objectId": "30"

que se serializa automáticamente de nuevo en un objeto DataProcessingRequestDTO antes de ser entregado al controlador listo para que lo use.

Como puede ver, esto es bastante poderoso y le permite serializar sus datos de JSON a un objeto sin tener que escribir una sola línea de código. Puedes hacer esto por @RequestParam y @RequestBody que le permite acceder a JSON dentro de sus parámetros o cuerpo de solicitud respectivamente.

Ahora que tiene un ejemplo concreto para comenzar, no debería tener ningún problema una vez que cambie su tipo de solicitud a application/json.

¡Haz clic para puntuar esta entrada!
(Votos: 3 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *