Wie erhalte ich Zugriff auf HTTP-Header-Informationen im Spring MVC REST-Controller?

154

Ich bin neu in der Webprogrammierung im Allgemeinen, insbesondere in Java, also habe ich gerade gelernt, was ein Header und ein Body sind.

Ich schreibe RESTful-Services mit Spring MVC. Ich kann einfache Dienste mit den @RequestMappingin meinen Controllern erstellen . Ich benötige Hilfe zum Verständnis, wie HTTP-Header-Informationen aus einer Anforderung abgerufen werden, die an meine Methode in meinem REST-Service-Controller gesendet wird. Ich möchte den Header analysieren und einige Attribute daraus erhalten.

Können Sie erklären, wie ich diese Informationen erhalte?

Pferdestimme
quelle

Antworten:

263

Wenn Sie einen Parameter mit kommentieren @RequestHeader, ruft der Parameter die Header-Informationen ab. Sie können also einfach so etwas tun:

@RequestHeader("Accept")

um den AcceptHeader zu bekommen .

Also aus der Dokumentation :

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

}

Die Werte Accept-Encodingund und Keep-AliveHeader werden in den Parametern encodingund keepAliveangegeben.

Und keine Sorge. Wir sind alle Noobs mit etwas.

Vidya
quelle
Danke dir. In einigen Codebeispielen in der Firma, für die ich arbeite, wird HttpServletRequest als Parameter angezeigt, und es gibt eine getHeader-Methode. Welcher Ansatz ist vorzuziehen?
Pferdestimme
1
Ziehen Sie Abstraktionen den Details einer API auf niedriger Ebene vor. Ich würde Spring MVC viel lieber die Details der ServletAPI abstrahieren lassen . Ich kann die Anmerkungen verwenden, um das, was ich brauche, aus der Anfrage herauszuholen.
Vidya
6
Sollte erwähnt werden, erhalten Sie als Antwort einen Fehler mit 400 fehlerhaften Anfragen, falls die Anfrage keinen solchen Header enthält. Flexibler ist der direkte Zugriff auf Anforderungsheader, wie in: stackoverflow.com/a/28209710/1828296
lospejos
Ich denke, es hängt davon ab, was Sie tun möchten, aber eine Antwort von 400 ist das Verhalten, das ich in diesem Fall fast immer haben möchte.
Vidya
@lospejos, die mit dem vermieden werden kann requiredFlagge als @RequestHeader(name = "Keep-Alive", required = false) long keepAlivedas wird die Keep - Alive auf null gesetzt , wenn nicht vorgesehen. Es gibt auch ein defaultValueFeld für die Anmerkung docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/…
Niccolò
88

Sie können die @RequestHeaderAnnotation mit dem HttpHeadersMethodenparameter verwenden, um Zugriff auf alle Anforderungsheader zu erhalten:

@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
quelle
Was ist mit dem Text der http-Anfrage? Wie greife ich auf die Header-Details zu? Können Sie mir erklären, ob es sich bei HttpHeaders um eine Karte handelt, für deren Zugriff ich einen Schlüssel benötige?
Pferdestimme
HttpHeaders verfügt über Getter, um die Header-Details abzurufen. Sie können diesen Link erkunden, um die Details zu erhalten: docs.spring.io/spring/docs/3.1.x/javadoc-api/org/…
Debojit Saikia
Ich habe meine Antwort bearbeitet, um zu zeigen, wie Sie auf den Anfragetext zugreifen können.
Debojit Saikia
1
Warum wird Streamsource benötigt? Es scheint zu kompliziert. Es muss einen einfacheren Weg geben, als Streams usw. zu verwenden.
Horse Voice
Hier StringReaderwird der eingehende Zeichenstrom gelesen. StreamSourcearbeitet als Inhaber für eine Transformationsquelle in Form eines XML-Markup-Streams.
Debojit Saikia
14

Meine Lösung in den Header-Parametern mit Beispiel lautet user = "test" :

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

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