이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
HttpEntity
-
요청 Body에 있는 값을
-
HttpMessageConveter를 이용하여
-
특정 객체 타입으로 변환시킬 수 있다.
Example Code
Controller
@RestController
@RequestMapping("/api/events")
public class EventApi {
@Autowired
private ObjectMapper objectMapper;
@PostMapping
public Event createEvent(HttpEntity<Event> requset){
Event body = requset.getBody(); // 요청의 본문이다. = RequestBody
try {
System.out.println(objectMapper.writeValueAsString(body)); // ObjectMapper로
// Object를 Json으로 Parsing
} catch (JsonProcessingException e) {
e.printStackTrace();
}
MediaType contentType = requset.getHeaders().getContentType();
System.out.println(contentType);
return body;
}
}
TC
@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {
@Autowired
ObjectMapper objectMapper;
@Autowired
MockMvc mockMvc;
@Test
public void createEvent() throws Exception {
Event event = new Event();
event.setName("goodGid");
event.setLimit(10);
// Object를 String으로 Parsing한다.
String json = objectMapper.writeValueAsString(event);
mockMvc.perform(post("/api/events")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(json)) // = 요청 내용 = Body
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("name").value("goodGid"));
}
}
Result
{"id":null,"name":"goodGid","limit":10}
application/json;charset=UTF-8
...
MockHttpServletRequest:
HTTP Method = POST
Request URI = /api/events
Parameters = {}
Headers = [Content-Type:"application/json;charset=UTF-8"]
Body = {"id":null,"name":"goodGid","limit":10}
Session Attrs = {}
@RequestBody와 차이점
-
@RequestBody는 Body 정보만 접근이 가능하다.
-
HttpEntity는 Body 정보 + Header 정보까지 접근이 가능하다.
-
보다 자세한 @RequestBody에 대한 내용은
-
@RequestBody 애노테이션글을 참고하자.
맺음말
-
기본적으로 HttpMessageConveter에
-
특정 객체 타입으로 변환하는 Converter가 등록되어 있다.
-
만약 HttpMessageConveter과 관련하여
-
설정하는 방법이 궁금하다면
-
HttpMessageConverter 설정하기글을 참고하자.