HTTP 헤더 조회
# HttpServletResponse & HttpServletResponse
# HttpMethod
: HTTP 메서드를 조회한다.
# Locale
: Locale 정보를 조회한다.
# @RequestHeader MultiValueMap<String, String> headerMap
: 모든 HTTP 헤더를 MultiValueMap 형식으로 조회한다.
※ MultiValueMap
: 하나의 키에 여러 개의 값을 받을 수 있다.
# @RequestHeader("host") String host
: 특정 HTTP 헤더를 조회한다.
속성
- 필수 값 여부: required
- 기본 값 속성: defaultValue
# @CookieValue(value = "myCookie", required = false) String cookie
: 특정 쿠키를 조회한다.
속성
- 필수 값 여부: required
- 기본 값: defaultValue
@Slf4j
@RestController
public class RequestHeaderController {
@RequestMapping("/headers")
public String headers(HttpServletRequest request,
HttpServletResponse response,
HttpMethod httpMethod,
Locale locale,
@RequestHeader MultiValueMap<String, String> headerMap,
@RequestHeader("host") String host,
@CookieValue(value = "myCookie", required = false) String cookie
) {
log.info("request={}", request);
log.info("response={}", response);
log.info("httpMethod={}", httpMethod);
log.info("locale={}", locale);
log.info("headerMap={}", headerMap);
log.info("header Host={}", host);
log.info("mycookie={}", cookie);
return "ok";
}
}
HTTP 요청 파라미터
# HTTP 요청 메시지를 통해 데이터를 전달하는 세 가지 방법
① GET (쿼리 파라미터)
- 메시지 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해서 전달
- /url?username=jun&age=20
② POST (HTML Form)
- content-type: application/x-www-form-urlencoded
③ HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용(JSON, XML...)
- POST, PUT...
1, 2번의 경우에는
HttpServletRequest의 request.getParameter를 통해 조회할 수 있었다.
@RequestParam
@RequestParam을 통해 HTTP로 요청 파라미터를 전달할 수 있다.
- V4처럼 HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략이 가능하다.
- String, int, Integer 등 단순 타입이면 @RequestParam도 생략 가능하다.
- 너무 생략하는 것도 추천하지는 않는다.
// V3
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age
) {
log.info("username={}, age={}", username, age);
return "ok";
}
// V4
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
RequestParamRequired
required를 통해 특정 데이터만 반드시 포함하도록 하고, 나머지 데이터는 포함하지 않도록 설정할 수 있다.
// RequestParamRequired
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age
) {
log.info("username={}, age={}", username, age);
return "ok";
}
# 주의사항 1
int 형에 'null'을 입력하는 것은 불가능하다.(500 ERROR 발생)
→ 따라서 null을 받을 수 있는 Integer 객체로 변경하거나, "defaultValue"를 사용한다.
# 주의사항 2
파라미터 이름만 있고, 값이 없는 경우에도 빈 문자로 통과한다.
localhost:8080/request-param-required?username=
# defaultValue
빈 문자의 경우에도 defaultValue로 설정한 값으로 설정된다. 위처럼 username에 값을 넣지 않고 요청해도 username에 defaultValue인 guest가 들어간다.
// defaultValue
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age
) {
log.info("username={}, age={}", username, age);
return "ok";
}
파라미터를 Map, MultiValueMap으로 조회하기
파라미터의 값이 1개가 확실하다면 Map 을 사용해도 되지만, 그렇지 않다면 MultiValueMap 을 사용한다. 일반적으로 파라미터에 값이 두 개 이상인 상황이 흔치는 않다.
// Map
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
return "ok";
}
'🌱 Spring > MVC ①' 카테고리의 다른 글
[Spring] HTTP message body에 데이터 담아서 요청하기 (0) | 2023.07.24 |
---|---|
[Spring] HTTP 요청 - @ModelAttribute (0) | 2023.07.24 |
[Spring] RequestMapping _ API 매핑 (0) | 2023.07.22 |
[Spring] Logging (0) | 2023.07.22 |
[Spring] MVC _ @RequestMapping (2) (0) | 2023.07.22 |