Spring에서의 요청을 알아보려고 한다. 먼저 매핑정보에 대해서 알아봐야하는데
class 단위의 controller 설정
method 단위 설정
parameter 단위 설정
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long
orderId) {
log.info("mappingPath userId={}, orderId={}", userId, orderId);
return "ok";
}
@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 요청 메세지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법은 3가지를 주로 사용한다.
위 방식중 GET과 HTML Form 방식은 사용방법을 이미 알고 있으므로(실무에서 너무 많이 씀...) message body에 데이터 전달하는 방법(API에서 많이 사용되는 방식)만 정리하려고 한다.
Servlet으로 받기
@Slf4j
@Controller
public class RequestBodyJsonController {
private ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/request-body-json-v1")
public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws OException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age={}", data.getUsername(), data.getAge());
response.getWriter().write("ok");
}
}
servlet의 inputStream을 가져와서 utf-8로 디코딩하여 메세지 바디의 내용을 뽑아오는 방식이다.
@RequestBody 사용
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "ok";
}
@RequestBody를 사용하여 앞선 방식에서 Servlet을 String으로 치환하는 과정을 제거할 수 있다. 또한 @ResponseBody를 사용하여 반환되는 HTTP message body에 직접 내용을 전달할 수 있게 된다.
@ReqeustBody 사용2
@ResponseBody@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data) {
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "ok";
}
위에서 사용된 방식과 동일한거 같지만 @RequestBody를 사용하여 객체를 직접 전달받아서 사용했다.
HTTPEntity, @RequestBody를 사용하면 HTTP 메세지 컨버터가 HTTP 메세지 바디의 내용을 우리가 원하는 문자나 객체로 변환해준다. 또한 JSON 객체로도 변환해주는데 HTTP 컨버터에 대해서는 다시 정리해놓겠다.
HttpEntity 사용
@ResponseBody
@PostMapping("/request-body-json-v4")
public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity) {
HelloData data = httpEntity.getBody();
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "ok";
}
@RequestBody와 같이 HttpEntity를 직접사용해서 사용할 수 있다.