Spring MVC REST 컨트롤러에서 HTTP 헤더 정보에 액세스하는 방법은 무엇입니까?


154

나는 일반적으로 웹 프로그래밍, 특히 Java를 처음 사용하므로 헤더와 본문이 무엇인지 알게되었습니다.

Spring MVC를 사용하여 RESTful 서비스를 작성 중입니다. @RequestMapping내 컨트롤러에서 간단한 서비스를 만들 수 있습니다 . REST 서비스 컨트롤러의 메소드에 대한 요청에서 HTTP 헤더 정보를 얻는 방법을 이해하는 데 도움이 필요합니다. 헤더를 파싱하고 속성을 가져오고 싶습니다.

그 정보를 얻는 방법을 설명해 주시겠습니까?

답변:


264

로 매개 변수에 주석을 달면 매개 변수가 @RequestHeader헤더 정보를 검색합니다. 따라서 다음과 같이 할 수 있습니다.

@RequestHeader("Accept")

Accept헤더 를 가져옵니다 .

따라서 설명서에서 :

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

}

Accept-EncodingKeep-Alive헤더 값이 제공된다 encodingkeepAlive각각 파라미터.

걱정할 필요가 없습니다. 우리는 모두 무언가에 멍청한 놈입니다.


감사합니다. 내가 일하는 회사의 일부 코드 예제에서 HttpServletRequest를 매개 변수로보고 getHeader 메서드가 있습니다. 어떤 접근법이 선호됩니까?
Horse Voice

1
API의 하위 레벨 세부 사항에 대한 추상화를 선호하십시오. Spring MVC가 ServletAPI 의 세부 사항을 추상화하도록하고 싶습니다 . 주석을 사용하여 요청에서 필요한 것을 가져올 수 있습니다.
Vidya

6
요청에 이러한 헤더가 포함되지 않은 경우 응답으로 400 잘못된 요청 오류가 발생합니다. 보다 유연한 방법은 다음에 설명 된대로 요청 헤더에 직접 액세스하는 것입니다. stackoverflow.com/a/28209710/1828296
lospejos

나는 그것이 당신이하고 싶은 것에 달려 있다고 생각하지만, 400 응답은 그 경우 거의 항상 원하는 행동입니다.
Vidya

이와 required같은 플래그 를 사용하여 피할 수있는 @lospejos는 @RequestHeader(name = "Keep-Alive", required = false) long keepAlive제공되지 않으면 keepAlive를 널로 설정합니다. defaultValue주석 docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/…에
Niccolò

88

메소드 매개 변수 @RequestHeader와 함께 주석을 사용하여 HttpHeaders모든 요청 헤더에 액세스 할 수 있습니다.

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

http 요청 본문은 어떻습니까? 헤더 세부 사항에 어떻게 액세스합니까? HttpHeaders가 액세스 키가 필요한 맵인지 설명해 주시겠습니까?
말 음성

HttpHeaders에는 헤더 관련 정보를 얻는 getter가 있습니다. 당신은 세부 사항을 얻기 위해이 링크를 탐색 할 수 있습니다 : docs.spring.io/spring/docs/3.1.x/javadoc-api/org/...
Debojit Saikia

요청 본문에 액세스하는 방법을 보여주기 위해 내 답변을 편집했습니다.
Debojit Saikia

1
스트림 소스가 필요한 이유는 무엇입니까? 너무 복잡해 보입니다. 스트림 등을 사용하는 것보다 쉬운 방법이 있어야합니다.
Horse Voice

여기 StringReader들어오는 문자 스트림을 읽는 데 사용됩니다. StreamSourceXML 마크 업 스트림의 형태로 변환 소스의 홀더로 작동합니다.
Debojit Saikia

14

예를 들어 헤더 매개 변수의 내 솔루션은 user = "test" 입니다.

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

System.out.println(headers.get("user"));
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.