아래는 java의 기본 제공 기능을 이용하여 웹 서버에 통신을 해서 JSON 데이터를 주고 받으려고 작성한 코드이다
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setDefaultUseCaches(false);
OutputStream os = conn.getOutputStream();
os.write(message);
os.close();
InputStream is = conn.getInputStream();
while (is.available() > 0) {
baos.write((char) is.read());
}
is.close();
진짜 별거 없는 코드인데, 서버가 응답을 안주는 경우가 있다.
처음엔 버그인가 한참 고민을 했었는데, 단순히 request header에 Content-Type을 application/json으로 설정해주자 아무 문제 없이 동작하기 시작했다.
왜일까?
이게 왜인지 한번 고민을 해봤다.
서버는 HTTP 서버다, json 이던 뭐던 HTTP header와 body가 있어야하는 것이 당연하다.
그리고 body는 header의 Content-Type에 따라서 어떻게 해석할지 고민을 해야한다. 아마 Content-Type이 없다면, 기본적으로 HTML 데이터로 판단하지 않을까? 혹은 각 Content-Type별로 처리하는 해석기가 등록되지 않은 상황에는 엉뚱한 동작을 할 수 도 있겠다는 판단을 내릴 수도 있다.
사실 위의 예제로 접속한 서버는 Firebase 서버로 push notification을 날리기 위해서였다.
내부 구조는 확실하게 알 수 없었지만, Content-Type을 잘 넣어주는 것으로 마친다.