이슈 발생
API를 연동하다 보면, http 통신에 있어서 클라이언트가 서버에 데이터를 보낼 때, 아래와 같이 헤더에 "Content-Type"을 명시해줘야 하는 일이 종종 생긴다.
'Content-Type': 'application/json'
어떤 형식의 데이터로 주고 받을지 정하는 것인데, 위의 상황이라면 데이터 형식이 "JSON" 형식임을 알리는 것이다. 필자도 진행하고 있는 프로젝트 상에서 저 형식으로 API 연동을 진행하던 중.. 에러가 하나 발생했다.
'application/json charset=utf-8' not supported
문제 해결 과정
분명 json 형식으로만 주겠다고 명시했는데, 뒤에 딸려있는 놈은 뭔가.. 하고 봤었다. 구글링을 해보니, 간혹 일부 서버는 charset=utf-8이 추가된 Content-Type을 지원하지 않기 때문에 발생한다는 문제라고 한다. 나는 분명 잘못이 없으니 백엔드한테 따지자..! 하지말고 필자도 이번에 알게된건데, 개발자들이 쉽게 Mock API를 생성하고 테스트할 수 있도록 도와주는 사이트가 있었다.
Beeceptor - Rest/SOAP API Mocking, HTTP Debugger & Proxy
Beeceptor helps you build mock rest and SOAP APIs without any coding. It is your go to tool for HTTP request debugging, intercepting and proxying.
beeceptor.com
여기에서 더미 API를 만들고 쏴보니.. 진짜로 헤더에 'application/json;charset=utf-8'가 박힌 형식으로 데이터가 갔었다. 왜이러지.. 하고 구글링도 좀 더 해봤었는데 나랑 똑같은 에러를 겪으신 분을 볼 수 있었다.
Server API not accept JSON edcoded data Flutter
Edit: After hours of work, i might because when i send "content-type": "application/json", it send "application/json; charset=utf-8" to server. How to remove ; charset...
stackoverflow.com
여기에 나와있는 해결책은 다 따라해 봤었는데, 필자는 실제로 해결되진 않았다. 그래도 다들 쉽게 깜빡할 수 있는 부분들을 체크할 수 있기에, 같은 에러를 겪고 계신 분들이라면 한 번쯤 들어가서 읽어보는 걸 추천한다.
참고로 글을 올리신 분은 백엔드 개발자 분께 말씀드려서, 받는 형식을 바꾸셨다고 한다.. 역시 나도 백엔드한테 따져야 해..!!! 농담입니다.
해결법
필자는 이 방식으로 해결했다.
request.headers.set(HttpHeaders.contentTypeHeader, 'application/json');
아무래도 서버 측에서는 순수한 "application/json"만을 원하는 상황이니, 클라이언트 쪽에서도 순수하게 그 부분만 첨가해서 보내주면 어떨까? 라는 생각에서 비롯된 해결방식이었다. 현재 Dart에서 제공하고 있는 "HttpClient"를 사용해서 헤더를 설정했고, "charset=utf-8"가 디폴트로 같이 설정되지 않도록 했다. beeceptor에서도 확인해보니, 순수하게 "application/json"로만 데이터 형식이 정해진 걸 확인할 수 있었다.
필자와 같은 에러를 겪은 분들에게 이 글이 조금이나마 도움이 되길 바라고, 제 삽질에 대한 결실만 가져가세요 아무래도 에러라는게 프로젝트마다 또 상황에 따라서 발생하는 이유가 천차만별이니, 또 다른 방법으로 해결하신 분이 있다면, 공유를 해주시면 도움이 많이 될 것 같다.