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-Encoding및 Keep-Alive헤더 값이 제공된다 encoding및 keepAlive각각 파라미터.

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


감사합니다. 내가 일하는 회사의 일부 코드 예제에서 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.