Come ottenere l'accesso alle informazioni dell'intestazione HTTP nel controller REST Spring MVC?


154

Sono nuovo nella programmazione web in generale, specialmente in Java, quindi ho appena imparato cos'è un header e un body.

Sto scrivendo servizi RESTful utilizzando Spring MVC. Sono in grado di creare servizi semplici con i @RequestMappingmiei controller. Ho bisogno di aiuto per capire come ottenere informazioni sull'intestazione HTTP da una richiesta che arriva al mio metodo nel mio controller di servizio REST. Vorrei analizzare l'intestazione e ricavarne alcuni attributi.

Potresti spiegare come ottengo queste informazioni?

Risposte:


264

Quando si annota un parametro con @RequestHeader, il parametro recupera le informazioni dell'intestazione. Quindi puoi semplicemente fare qualcosa del genere:

@RequestHeader("Accept")

per ottenere l' Acceptintestazione.

Quindi dalla documentazione :

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

}

I valori di intestazione Accept-Encodinge Keep-Alivesono forniti rispettivamente nei parametri encodinge keepAlive.

E nessuna preoccupazione. Siamo tutti un po 'con qualcosa.


Grazie. In alcuni esempi di codice dell'azienda per cui lavoro, vedo HttpServletRequest come parametro e su di esso è presente un metodo getHeader. Quale approccio è preferibile?
Horse Voice

1
Preferisci le astrazioni ai dettagli di basso livello di un'API. Preferirei di gran lunga avere estratto di Spring MVC dai dettagli Servletdell'API. Posso usare le annotazioni per estrarre ciò di cui ho bisogno dalla richiesta.
Vidya,

6
Dovresti menzionare, riceverai un errore di 400 richieste errate come risposta nel caso in cui la richiesta non contenga tale intestazione. Modo più flessibile è l'accesso diretto alle intestazioni di richiesta, come descritto in: stackoverflow.com/a/28209710/1828296
lospejos

Immagino che dipenda da cosa vuoi fare, ma una risposta 400 è il comportamento che vorrei quasi sempre in quel caso.
Vidya,

@lospejos che può essere evitato usando il requiredflag in @RequestHeader(name = "Keep-Alive", required = false) long keepAlivequesto modo imposterà keepAlive su null se non fornito. C'è anche un defaultValuecampo per l'annotazione docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/…
Niccolò,

88

È possibile utilizzare l' @RequestHeaderannotazione con il HttpHeadersparametro method per accedere a tutte le intestazioni di richiesta:

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

E il corpo della richiesta http? Come posso accedere alle specifiche dell'intestazione? potresti spiegarmi se HttpHeaders è una mappa a cui ho bisogno di una chiave per accedere?
Horse Voice

HttpHeaders ha getter per ottenere i dettagli dell'intestazione. puoi esplorare questo link per ottenere i dettagli: docs.spring.io/spring/docs/3.1.x/javadoc-api/org/…
Debojit Saikia

modificato la mia risposta per mostrare come è possibile accedere al corpo della richiesta.
Debojit Saikia,

1
Perché è necessario lo streamsource? Sembra troppo complicato. Deve esserci un modo più semplice dell'uso di flussi, ecc.
Horse Voice,

Qui StringReaderè usato per leggere il flusso di caratteri in arrivo. StreamSourcefunziona come titolare di una fonte di trasformazione sotto forma di flusso di markup XML.
Debojit Saikia,

14

La mia soluzione nei parametri Header con l'esempio è user = "test" è:

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

System.out.println(headers.get("user"));
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.