개발모음집

안드로이드, 서버와 http 통신할때 Content-type 본문

Android

안드로이드, 서버와 http 통신할때 Content-type

void 2017. 6. 22. 12:19


// 서버에게 웹에서 <Form>으로 값이 넘어온 것과 같은 방식으로 처리하라는 걸 알려준다
conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");

서버에 텍스트만 넘길때는 이런 식으로 사용했다.

기능상 이미지 및 오디오파일을 서버에 넘겨야하는 일이 생겼다.

내가 하고 싶은건 전송버튼을 클릭했을 때 텍스트와 이미지 파일, 오디오파일이 모두 전송되면 좋겠다. 

우선 생각한 방식이 스레드를 각각 만들어서 텍스트보내는 스레드, 오디오파일보내는 스레드, 이미지파일보내는 스레드를 만들어 전송버튼을 클릭하면 보내려했다.

하지만 스레드특성상 동시라는 개념이 없고, 내가 스레드에 순번을 주어 스레드를 컨트롤한다할지라도 스레드컨트롤이 어렵다고 판단하였다.

그래서 한 스레드에 텍스트,오디오,이미지를 보내려고 한다.

참고블로그1에서 오디오파일을 보내는 방식을 확인했다.

(오디오파일 보내는 코드는 참고블로그1 링크누르고 보시길)



conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);


이게 뭔지 잘모르겠다.


참고 블로그2를 보고 리퀘스트 코드에 대해 대략적인 감을 잡았다.


// HttpURLConnection 객체 생성.
HttpURLConnection conn = null;

// URL 연결 (웹페이지 URL 연결.)
conn = (HttpURLConnection)url.openConnection();

// TimeOut 시간 (서버 접속시 연결 시간)
conn.setConnectTimeout(CONN_TIMEOUT * 1000);

// TimeOut 시간 (Read시 연결 시간)
conn.setReadTimeout(READ_TIMEOUT * 1000);

// 요청 방식 선택 (GET, POST)
conn.setRequestMethod(GET);

// Request Header값 셋팅 setRequestProperty(String key, String value)
conn.setRequestProperty("NAME", "name");
conn.setRequestProperty("MDN", "mdn");
conn.setRequestProperty("APPID", "appid");

// 서버 Response Data를 xml 형식의 타입으로 요청.
conn.setRequestProperty("Accept", "application/xml");

// 서버 Response Data를 JSON 형식의 타입으로 요청.
conn.setRequestProperty("Accept", "application/json");

// 타입설정(text/html) 형식으로 전송 (Request Body 전달시 text/html로 서버에 전달.)
conn.setRequestProperty("Content-Type", "text/html");

// 타입설정(text/html) 형식으로 전송 (Request Body 전달시 application/xml로 서버에 전달.)
conn.setRequestProperty("Content-Type", "application/xml");

// 타입설정(application/json) 형식으로 전송 (Request Body 전달시 application/json로 서버에 전달.)
conn.setRequestProperty("Content-Type", "application/json");

// 컨트롤 캐쉬 설정
conn.setRequestProperty("Cache-Control","no-cache");

// 타입길이 설정(Request Body 전달시 Data Type의 길이를 정함.)
conn.setRequestProperty("Content-Length", "length")

// User-Agent 값 설정
conn.setRequestProperty("User-Agent", "test");

// OutputStream으로 POST 데이터를 넘겨주겠다는 옵션.
conn.setDoOutput(true);

// InputStream으로 서버로 부터 응답을 받겠다는 옵션.
conn.setDoInput(true);

// Request Body에 Data를 담기위해 OutputStream 객체를 생성.
OutputStream os = conn.getOutputStream();

// Request Body에 Data 셋팅.
os.write(body.getBytes("euc-kr"));

// Request Body에 Data 입력.
os.flush();

// OutputStream 종료.
os.close();

// 실제 서버로 Request 요청 하는 부분. (응답 코드를 받는다. 200 성공, 나머지 에러)
int responseCode = conn.getResponseCode();

// 접속해지
conn.disconnect();

출처: http://arabiannight.tistory.com/entry/안드로이드Android-HttpUrlConnection-Request-설명-및-설정-하기-header-get-post-body등 [아라비안나이트]


서버에 어떻게 데이터를 보내고 어떻게 데이터를 받는지 정하는 코드란걸 알았고


참고블로그3를 보니 Content-Type을 Multipart를 이용하여 한 번에 전송이 가능하다고 한다.


String boundary = "*****";
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

사용법설명을 보니

문자열로 boundary를 초기화하고 있는데, 이 때 사용되는 문자열은 어떠한 것이든 상관 없다.

이 문자열은 넘겨지는 각 인자를 구분하기 위한 구분자이다.


라고 boundary에 대한 설명이 되어있다.


conn.setRequestProperty("Connection", "Keep-Alive");

이건 뭘까?

참고블로그4

HTTP특성상 한 번열결하고 끊고 재연결시 새롭게 연결한다.
하지만 HTTP1.1에서부터는 재연결시 재사용할 수 있도록 한다.

이 코드를 쓴다고 되는 건 아니고 서버에서도 Keep-Alive를 지원해야 이용이 가능하다.