REST API Content-Type 설정

DongGeon Lee
4 min readJan 10, 2021

--

(결론)클라이언트에서 JSON형태로 오는 request는 Content-Type: application/json으로 설정해줘야 한다.

현재 공익 생활을 하면서 대학 동기들과 Nomakese(가명)라는 어플을 개발중이다. 나는 서버 파트를 담당하고 있으며 TypeScript, Express, MySQL로 개발중이다.
Server-Client개발 회의를 하던 중, client로부터의 request 데이터가 제대로 전송되지 않는 문제가 발생하였고 이를 해결하기 위해 배운 지식을 적고자 한다.

What is a Content-Type?

Content-Type이란 리소스의 미디어 타입을 나타내기 위해 사용된다. 요청(request)에서 Content-Type은 클라이언트가 서버에게 어떤 형식의 데이터가 실제로 보내지는 것인지 알려주는 용도로 사용된다.

The Content-Type entity header is used to indicate the media type of the resource. In requests, (such as POST or PUT), the client tells the server what type of data is actually sent. (Source: MDN Web Docs)

How to set Content-Type

Content-Type은 리소스 혹은 데이터의 MIME type을 지정하면 된다.

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
  • application/json
    애플리케이션간 데이터 통신에서 JSON형식이 사용된다.

JSON has been used to exchange data between applications written in all of these programming languages. (Source: IANA)

POST /test HTTP/1.1
Host: localhost
Content-Type: application/json
{
"name":"DongGeon Lee",
"age":"26"
}
  • application/x-www-form-urlencoded
    웹브라우져와 서버 애플리케이션에서 사용되는 형식이다. 이 형식은 HTML form 제출 payload 양식을 나타내기 위한 default형식이다.

This type is only intended to be used to describe HTML form submission payloads.(Source: IANA)

POST /test HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
name=DongGeonLee&age=26

Conclusion

최근의 RESTful 한 어플리케이션들은 JSON형식의 데이터를 주고 받는 것이 보통이다. 따라서 JSON형식의 데이터를 보낸다는 것을 알려주기 위해서 request header에 Content-Type: application/json을 설정해줘야 한다.

하지만 어느 실무 블로거에 의하면 JSON타입이 많이 쓰인다고는 하나 x-www-form-urlencoded형식도 여전히 쓰이는 방식이며 이 방식으로 요청을 보내도록 이미 개발된 앱들에게 변경을 요구할 수는 없는 노릇이다. 따라서 서버는 유효한 요청에 한해 필요하다면 유연한 대응을 할 수 있도록 두 가지 방식을 모두 수용할 수 있도록 개발되어야 한다.

어쨌든 현재 내가 개발하는 어플리케이션은 모바일 앱이고 JSON형식으로 데이터를 주고받는 것이 일반적이니, Content-Type: application/json를 사용하면 되겠다.

Ref:

  1. https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Type
  2. https://www.iana.org/assignments/media-types/media-types.xhtml
  3. https://gist.github.com/jays1204/703297eb0da1facdc454
  4. https://blog.naver.com/writer0713/221853596497
  5. https://caileb.tistory.com/192

--

--