Post

[HTTP] HTTP Header에 담긴 Content-Type이란?


아이티윌의 국비지원 [스프링부트 SNS 포토그램 프로젝트] 강의를 수강하며 정리한 내용입니다.


HTTP Header에 담긴 Content-Type 이해하기


Content-Type이란?

HTTP Body의 데이터 형식을 의미한다.


Content-Type 종류

  • x-www-form-urlencoded

    데이터 형식 : Key = Value

  • text/plain

    데이터 형식 : 안녕(평문)

  • application/json

    데이터 형식 : {“username” : “홍길동”}

스프링부트는 기본적으로 x-www-form-urlencoded 타입을 파싱(분석)해준다.


Content-Type이 필요한 이유?

Body Data를 전송할 때 Content-Type을 명시해야 받는 쪽에서 수월하게 처리할 수 있기 때문이다.

다시 말해, 곡식을 나르는 A가 포대에 담긴 내용물이 무엇인지 적어두지 않고 B에게 건낸다면 일일히 열어봐야 하는 번거러움이 있기 때문에 포대에 미리 적어두고 나르는 것과 같다고 보면 된다.

Content-Type은 POST와 PUT 요청 땐 필수사항이고, GET과 DELETE 요청 땐 Body Data가 없기 때문에 필요 없다.


실습


[x-www-form-urlencoded]

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
public class HttpBodyController {
    
    private static final Logger log = LoggerFactory.getLogger(HttpBodyController.class);

    @PostMapping("/body1")
    public String xwwwformurlencoded(String username) { // 매개변수명이 전송된 데이터의 key 값과 일치해야 받을 수 있음.

        log.info(username);
        return "key=value 전송옴";
    }
}

매개변수명이 전송된 데이터의 key 값과 일치해야 받을 수 있다.



[text/plain]

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
public class HttpBodyController {

    private static final Logger log = LoggerFactory.getLogger(HttpBodyController.class);

    @PostMapping("/body2")
    public String textplain(@RequestBody String data) { // text/plain 형식의 데이터를 받으려면 @RequestBody 어노테이션을 붙여주어야함.

        log.info(data);
        return "text/plain 전송옴";
    }
}

text/plain 형식의 데이터를 받으려면 @RequestBody 어노테이션을 붙여주어야 한다.



[application/json]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RestController
public class HttpBodyController {

    private static final Logger log = LoggerFactory.getLogger(HttpBodyController.class);

    @PostMapping("/body3")
    public String applicationjson(@RequestBody String data) { // json형식의 경우 @RequestBody 어노테이션을 붙여주면 {"username" : "홍길동"}이 그대로 날라옴.  

        log.info(data);
        return "application/json 전송옴";
    }

    @PostMapping("/body4")
    public String applicationjsonToObject(@RequestBody User user) { // User 클래스를 만들어 Java 객체로 받아주면 data 값만 받아오기 가능.

        log.info(user.getUsername()); // username의 data 값만 받아옴.
        return "application/json 전송옴";
    }
}

Json형식의 경우 @RequestBody 어노테이션을 붙여주면 {“username” : “홍길동”}이 그대로 날라온다. MessageConverter가 자동으로 JavaObject를 Json으로 변경해서 통신을 통해 응답 해주는 것. @RestController 일때만 MessageConverter가 작동함.
User 클래스를 만들어 Java 객체로 받아주면 Data 값만 받아오는게 가능하다.


This post is licensed under CC BY 4.0 by the author.