@RequestHeader 사용해 HTTP Request의 헤더 값 처리하기
@RequestHeader을 사용하면, Http Request의 헤더에서 특정 키에 대한 값을 변수에 매핑할 수 있다. 예를 들어 헤더에서 Accep-Language 의 값을 찾아내 accepLanguage 변수에 매핑하고 싶다면 다음과 같이 사용하면 된다.
*물론 실제로 Accept-Language는 복수의 언어가 올 수 있기 때문에 이렇게 처리하면 안된다. 여기서는 간단한 예시를 위해 이렇게 만들었다.
@Controller
class HomePageController {
@GetMapping("/blog/info")
fun getBlogInfo(
@RequestParam(value = "blogUrl")
blogUrl: String,
@RequestHeader(value = "Accept-Language")
acceptLanguage: String // Accept-Language 값을 acceptLanguage 변수에 매핑
): ResponseEntity<BlogInfo> {
val blogInfoMap = if (acceptLanguage == "ko") {
koreanBlogInfoMap
} else {
englishBlogInfoMap
}
val blogInfo = blogInfoMap[blogUrl] ?: return ResponseEntity.notFound().build()
return ResponseEntity.ok(blogInfo)
}
}
private val koreanBlogInfoMap = mapOf(
"kotlinworld.com" to BlogInfo("조세영의 Kotlin World", 3),
"dummyUrl.dummyUrl" to BlogInfo("더미 Blog", 3)
)
private val englishBlogInfoMap = mapOf(
"kotlinworld.com" to BlogInfo("Seyoung's Kotlin World", 3),
"dummyUrl.dummyUrl" to BlogInfo("Dummy Blog", 3)
)
이와 같이 스프링 프레임웍은 RequestHeader의 value 값에 해당하는 키를 읽어 변수에 매핑한다. 이제 위와 같이 코드를 작성하고, /blog/info 경로에 다음과 같은 HTTP 요청을 날려보자. 이 Http 요청은 query 로 blogUrl=kotlinworld.com을 포함하며, 헤더에는 Accept-Language: ko를 가진다.
GET http://localhost:8081/blog/info?blogUrl=kotlinworld.com
Accept-Language: ko
그러면 블로그 정보가 한국어로 처리돼 다음과 같은 결과가 나오는 것을 볼 수 있다.
그러면 이번에는 AccepLangauge를 en으로 바꿔서 요청을 날려보자.
GET http://localhost:8081/blog/info?blogUrl=kotlinworld.com
Accept-Language: en
그러면 블로그 정보가 영어로 처리돼 다음과 같은 결과가 나오는 것을 볼 수 있다.
이렇게 RequestHeader을 사용해 Http Request의 헤더의 값을 읽어내 처리할 수 있다.
@RequestHeader에 defaultValue 사용해 기본 값 설정하기
하지만, @RequestHeader을 사용해 헤더값을 읽도록 설정했는데, 클라이언트로부터의 HTTP 요청에 헤더가 설정되어 있지 않을 수 있다. 이런 경우 기본 값을 설정할 수 있다. 예를 들어 유저로부터 Accept-Lanauge 값이 오지 않을 경우 영어로 처리해야 한다면, 다음과 같이 설정하면 된다.
*다시 말하지만 Accept-Language는 복수의 언어가 올 수 있기 때문에 이렇게 처리하면 안 된다. 여기서는 간단한 예시를 위해 이렇게 만들었다.
@Controller
class HomePageController {
@GetMapping("/blog/info")
fun getBlogInfo(
@RequestParam(value = "blogUrl")
blogUrl: String,
@RequestHeader(value = "Accept-Language", defaultValue = "en") // 기본 값을 en으로 설정
acceptLanguage: String
): ResponseEntity<BlogInfo> {
val blogInfoMap = if (acceptLanguage == "ko") {
koreanBlogInfoMap
} else {
englishBlogInfoMap
}
val blogInfo = blogInfoMap[blogUrl] ?: return ResponseEntity.notFound().build()
return ResponseEntity.ok(blogInfo)
}
}
이제 스프링 애플리케이션을 재실행 후, Accept-Language 값을 빼고 요청을 보내보자. 그러면 Accept-Language가 설정되지 않았음에도 응답이 영어로 오는 것을 볼 수 있다.
@RequestHeader에 required 값 설정해 헤더 값 선택적으로 획득하기
@RequestHeader는 모두 required가 true로 설정되어 있기 때문에 설정한 헤더 값이 유저로부터든, 프레임워크로부터든(defaultValue) 입력돼야 했다.
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true; // 기본 값이 true로 설정되어 있다.
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
만약 required가 false라면, 유저가 Accept-Language를 보내지 않을 경우에 acceptLanguage의 값을 null로 설정해 처리할 수 있다. 예를 들어 다음과 같이 코드를 만들어보자. 그러면 유저가 Accept-Language 헤더를 보내지 않을 경우에 acceptLanguage 값이 null로 설정돼 처리될 수 있다.
@GetMapping("/blog/info")
fun getBlogInfo(
@RequestParam(value = "blogUrl")
blogUrl: String,
@RequestHeader(value = "Accept-Language", required = false)
acceptLanguage: String? // 유저가 Accept-Lanauge를 보내지 않으면 null로 설정됨
): ResponseEntity<BlogInfo> {
val blogInfoMap = if (acceptLanguage == null) {
koreanBlogInfoMap
} else {
englishBlogInfoMap
}
val blogInfo = blogInfoMap[blogUrl] ?: return ResponseEntity.notFound().build()
return ResponseEntity.ok(blogInfo)
}
따라서 아래와 같은 HTTP 요청을 헤더 없이 날리면,
GET http://localhost:8081/blog/info?blogUrl=kotlinworld.com
acceptLanauge 값이 null로 처리돼 한국어 블로그 정보가 가져와진다.