dev_eun

[Android] HttpURLConnection으로 POST 요청하기 본문

기타/안드로이드

[Android] HttpURLConnection으로 POST 요청하기

_eun 2020. 10. 19. 00:22

프로젝트에서 팀원이 만든 restful API에 POST 요청을 해야 하는데, 어떻게 하는지 몰라서 방황했다.

잊어버릴까봐 기록

 

참고 : privatedevelopnote.tistory.com/18

 

[안드로이드/Android] HttpURLConnection 을 이용한 Multipart/form-data 파일 업로드

안드로이드 6.0 부터 Apache HTTP Client가 제거되었다. Android Develop에서는 HttpURLConnection  을 사용하라고 한다. 본론으로 들어가서 HttpURLConnection을 이용해 파일업로드를 하는 방법을 알아보도록..

privatedevelopnote.tistory.com

참고 코드

public class HttpConnection extends AsyncTask<String, Void, String> {
    private static final String TAG = "@@@";

    @Override
    protected String doInBackground(String... params) {
        final String urlStr = "요청할 서버 url";
        final String twoHyphens = "--";
        String[] dataName = {"보낼 데이터 key"};
        String resp = null;

        String lineEnd = "\r\n";
        String boundary = "androidupload";
        File targetFile = new File(params[2]);

        byte[] buffer;
        int maxBufferSize = 5 * 1024 * 1024;
        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection) new URL(urlStr).openConnection();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            assert conn != null;
            conn.setRequestMethod("POST");
        } catch (ProtocolException e) {
            e.printStackTrace();
        }
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(10000);
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setUseCaches(false);
        conn.setRequestProperty("ENCTYPE", "multipart/form-data");
        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
        String delimiter = twoHyphens + boundary + lineEnd; // --androidupload\r\n

        StringBuilder postDataBuilder = new StringBuilder();
        // 본인은 고정된 파라미터 개수이기 때문에 이렇게 사용
        for (int i = 0; i < 2; i++) {
            postDataBuilder.append(delimiter);
            postDataBuilder.
                    append("Content-Disposition: form-data; name=\"").
                    append(dataName[i]).append("\"").
                    append(lineEnd).
                    append(lineEnd).
                    append(params[i]).
                    append(lineEnd);
        }

		postDataBuilder.append(delimiter);
        postDataBuilder.
                append("Content-Disposition: form-data; name=\"").
                append(dataName[2]).
                append("\";filename=\"").
                append(targetFile.getName()).
                append("\"").append(lineEnd);
        try {
            DataOutputStream ds = new DataOutputStream(conn.getOutputStream());
            ds.write(postDataBuilder.toString().getBytes());

            ds.writeBytes(lineEnd);
            FileInputStream fStream = new FileInputStream(targetFile);
            buffer = new byte[maxBufferSize];
            int length = -1;
            while ((length = fStream.read(buffer)) != -1) {
                ds.write(buffer, 0, length);
            }
            ds.writeBytes(lineEnd);
            ds.writeBytes(lineEnd);
            ds.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // requestbody end
            fStream.close();

            ds.flush();
            ds.close();

            int responseCode = conn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                String line = null;
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                while ((line = br.readLine()) != null) {
                    resp += line;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return resp;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.d(TAG, "onPostExecute: " + result);
    }
}
728x90