HTTP Request 헤더 정보 얻기, 추가

박진선·2022년 12월 16일
0

HTTP Request 헤더를 읽어오는 여러가지 방법과 추가하는 방법에 대해 기록을 남겨보고자 한다.

커스텀 헤더 네이밍(Naming)
커스텀 헤더의 이름을 지을 때, 이 헤더를 사용하는 측에서 헤더의 목적을 쉽게 이용할 수 있도록 대시(-)를 기준으로 의미가 명확한 용어를 사용해야 한다. 대시(-)를 기준으로 각 단어의 첫 글자를 대문자로 작성하는 것이 관례이지만 Spring에서 Request 헤더 정보를 확인할 때, 대/소문자를 구분하지는 않는다.

HttpServletRequest와 HttpServletResponse는 저수준(Low Level)의 서블릿 API를 사용할 수 있기때문에 복잡한 HTTP Request/Response를 처리하는데 사용할 수 있다.

반면에 ResponseEntity나 HttpHeaders는 Spring에서 지원하는 고수준(High Level) API로써 간단한 HTTP Request/Response 처리를 빠르게 진행할 수 있다.

복잡한 처리가 아니라면 코드의 간결성이나 생산성 면에서 가급적 Spring에서 지원하는 고수준 API를 사용하길 권장한다.

@RestController
public class MemberController{
  @PostMapping
  public ResponseEntity headTest(@RequestHeader(HttpHeaders.USER_AGENT) String userAgent,
                       @RequestHeader Map<String,String> headers,
                       HttpServletRequest httpServletRequest,
                       HttpEntity httpEntity,
                       HttpServletResponse response) {

    //@RequestHeader 활용하기
    System.out.println("user-agent: " + userAgent);
    for(Map.Entry<String,String> entry : headers.entrySet()){
      System.out.println("key: " + entry.getKey() + "value: " + entry.getValue());
    }

    //HttpServletRequest 활용하기
    System.out.println("user-agent: " + httpServletRequest.getHeader("user-agent"));

    //HttpEntity 활용하기
    for(Map.Entry<String, List<String>> entry : httpEntity.getHeaders().entrySet()){
      System.out.println("key: " + entry.getKey() + "value: " + entry.getValue());
    }

    //HttpHeaders를 이용하여 커스텀헤더 추가
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.set("Client-Geo-Location", "Korea,Seoul");
    
    //HttpServletResponse를 이용하여 커스텀헤더 추가, 헤더 정보만 추가할 뿐 별도의 처리가 필요없음
    response.addHeader("Client-Geo-Location", "Korea,Seoul");
    
    //ResponseEntity를 이용하여 HttpHeaders 를 추가하여 반환함
    return new ResponseEntity<>(new Member(email, name, phone), httpHeaders,
                HttpStatus.CREATED);
   }
}
profile
주니어 개발자 입니다

0개의 댓글