1. [ HTTP 요청메시지 - JSON ]
•
HTTP API에서 주로 사용하는 JSON 데이터 형식을 조회해보자
package hello.springmvc.basic.request;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.springmvc.basic.HelloData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.PostMapping;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@Slf4j
@Controller
public class test {
private ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/test-json")
public void requestBodyJson(HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
log.info("username = {} , age = {}", helloData.getUsername(), helloData.getAge());
response.getWriter().write("ok");
}
}
Java
복사
•
HttpServletRequest를 사용해서 직접 HTTP 메시지 바디에서 데이터를 읽어와서 문자로변환한다
•
문자로 된 JSON 데이터를 JackSon라이브러리 objectMapper를 사용해서 자바객체로 변환한다
@RequestBody를 이용한 JSON 데이터 조회
/**
* @RequestBody
* HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*
* @ResponseBody
* - 모든 메서드에 @ResponseBody 적용
* - 메시지 바디 정보 직접 반환(view 조회X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*/
@ResponseBody
@PostMapping("/test-json2")
public String requestBodyJson2(@RequestBody String messageBody) throws JsonProcessingException {
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
log.info("username = {}, age = {}", helloData.getUsername(), helloData.getAge());
return "ok";
}
Java
복사
•
RequestBody를 사용해서 HTTP 메시지에서 데이터를 꺼내고 messageBody에 저장한다
•
문자로 된 JSON 데이터인 messageBody를 objectMapper를 통해서 자바객체로 변환
RequestBody를 이용해 변환과정이 필요없이 한번에 객체로 변환 시킬 수 도 있다.
@ResponseBody
@PostMapping("/test-json3")
public String requestBodyJson3(@RequestBody HelloData helloData){
log.info("helloData = {}", helloData);
log.info("username = {}, age = {}", helloData.getUsername(), helloData.getAge());
return "oK";
}
Java
복사
@RequestBody 객체파라미터
•
@RequestBody HelloData helloData
•
@RequestBody에 직접 만든 객체를 지정할 수있다
HttpEntity, @RequestBody를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디 내용을 우리가 원하는 문자나 객체 등으로 변환해준다. HTTP 메시지 컨버터는 문자 뿐만 아니라 JSON도 객체로 변환해준다
@RequestBody 는 생략 불가능!!
스프링은 @ModelAttribute, @RequestParam과 같은 해당 어노테이션을 생략시 다음과 같은 규칙을 적용한다.
- String, int, Integer 같은 단순타입 = @RequestParam
- 나머지 = @ModelAttribute(argument resolver로 지정해둔 타입외)
따라서 이 경우 HelloData에 @RequestBody를 생략하면 @ModelAttribute가 적용되어버린다.
HelloData date = @ModelAttribute HelloData date
따라서 생략하면 HTTP 메시지 바디가 아니라 요청 파라미터로 처리하게된다.
주의
HTTP 요청시에 content-type이 application/json인지 꼭! 확인해야한다. 그래야 JSON을 처리할 수 있는 HTTP 메시지 컨버터가 실행된다
•
@RequestBody 요청
◦
JSON 요청 → HTTP 메시지 컨버터 → 객체
•
@ResponseBody 응답
◦
객체 → HTTP 메시지 컨버터 → JSON 응답