반응형

네트워크를 통해서 HTTP 통신 후 Request 로 응답처리까지 처음하는 사람의 경우 어려울 수도 있어서 정리함

 

코드는 간단하게 정리해서 공유드리겠음

 

클래스는 2개를 추가해야한다.

RequestHttpConnection.java 와 NetworkTask.java 클래스 2개를 생성한다.

 

SMALL

 

1. RequestHttpConnection.java

   HTTP 연결 및 데이터 전달을 위한 클래스, 방식은 POST

public class RequestHttpConnection {
    public String request(String _url, ContentValues _params){

        // HttpURLConnection 참조 변수.
        HttpURLConnection urlConn = null;
        // URL 뒤에 붙여서 보낼 파라미터.
        StringBuilder sbParams = new StringBuilder();

        /**
         * 1. StringBuffer에 파라미터 연결
         * */
        // 보낼 데이터가 없으면 파라미터를 비운다.
        if (_params == null)
            sbParams.append("");
            // 보낼 데이터가 있으면 파라미터를 채운다.
        else {
            // 파라미터가 2개 이상이면 파라미터 연결에 &가 필요하므로 스위칭할 변수 생성.
            boolean isAnd = false;
            // 파라미터 키와 값.
            String key;
            String value;

            for(Map.Entry<String, Object> parameter : _params.valueSet()){
                key = parameter.getKey();
                value = parameter.getValue().toString();

                // 파라미터가 두개 이상일때, 파라미터 사이에 &를 붙인다.
                if (isAnd)
                    sbParams.append("&");

                sbParams.append(key).append("=").append(value);

                // 파라미터가 2개 이상이면 isAnd를 true로 바꾸고 다음 루프부터 &를 붙인다.
                if (!isAnd)
                    if (_params.size() >= 2)
                        isAnd = true;
            }
        }

        /**
         * 2. HttpURLConnection을 통해 web의 데이터를 가져온다.
         * */
        try{
            URL url = new URL(_url);
            urlConn = (HttpURLConnection) url.openConnection();
            urlConn.setConnectTimeout(HTTP_TIMEOUT_m);
            urlConn.setReadTimeout(HTTP_TIMEOUT_m);

            // [2-1]. urlConn 설정.
            urlConn.setRequestMethod("POST"); // URL 요청에 대한 메소드 설정 : POST.
            urlConn.setRequestProperty("Accept-Charset", "UTF-8"); // Accept-Charset 설정.
            urlConn.setRequestProperty("Context_Type", "application/x-www-form-urlencoded;cahrset=UTF-8");

            // [2-2]. parameter 전달 및 데이터 읽어오기.
            String strParams = sbParams.toString(); //sbParams에 정리한 파라미터들을 스트링으로 저장. 예)id=id1&pw=123;
            OutputStream os = urlConn.getOutputStream();
            os.write(strParams.getBytes(StandardCharsets.UTF_8)); // 출력 스트림에 출력.
            os.flush(); // 출력 스트림을 플러시(비운다)하고 버퍼링 된 모든 출력 바이트를 강제 실행.
            os.close(); // 출력 스트림을 닫고 모든 시스템 자원을 해제.

            // [2-3]. 연결 요청 확인.
            // 실패 시 null을 리턴하고 메서드를 종료.
            if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
                Log.e("RequestHttpConnection : Err[2-3] " + urlConn.getResponseCode());
                return null;
            }

            // [2-4]. 읽어온 결과물 리턴.
            // 요청한 URL의 출력물을 BufferedReader로 받는다.
            BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), StandardCharsets.UTF_8));

            // 출력물의 라인과 그 합에 대한 변수.
            String line;
            StringBuilder page = new StringBuilder();

            // 라인을 받아와 합친다.
            while ((line = reader.readLine()) != null){
                page.append(line);
            }

            return page.toString();

        } catch (IOException e) { // for URL.
            e.printStackTrace();
        }// for openConnection().
        finally {
            if (urlConn != null)
                urlConn.disconnect();
        }

        Log.e("RequestHttpConnection :  Err[END]");

        return null;

    }
}
반응형

2. NetworkTask.java

   AsyncTask 로 네트워크 Request 를 호출하여 처리할 수 있도록 함

public class NetworkTask extends AsyncTask<Void, Void, String> {

    private final String url;
    private final ContentValues values;
    private final Handler receiveHandler;  // 리턴 메세지를 반환할 Handler

    public NetworkTask(String url, ContentValues values, Handler receiveHandler) {
        this.url = url;
        this.values = values;
        this.receiveHandler = receiveHandler;
    }

    @Override
    protected String doInBackground(Void... params) {

        Log.d("URL : " + url );

        String result; // 요청 결과를 저장할 변수.
        RequestHttpConnection requestHttpURLConnection = new RequestHttpConnection();
        result = requestHttpURLConnection.request(url, values); // 해당 URL로 부터 결과물을 얻어온다.

        return result;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        //doInBackground()로 부터 리턴된 값이 onPostExecute()의 매개변수로 넘어오므로 s를 메세지에 담아 리턴한다.
        try {
            Log.d("onPostExecute : " + s );
            Message msg = receiveHandler.obtainMessage(SEND_WEB_RETURN);
            Bundle data = new Bundle();
            data.putString("WEB_RETURN", s);
            msg.setData(data);
            receiveHandler.sendMessage(msg);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

위 클래스를 작성하였다면 이젠 사용하는 방법만 익히면 가능함

 

3. 호출하여 사용

    메인에서 호출을 진행한다고 하는 경우

    아래처럼
    1) POST 데이터를 ContentValues 클래스로 삽입 

    2) 리턴 값을 처리 할 Handler 를 생성

    3) 변수들을 삽입 후 실행~!!

    4) 리턴으로 돌아온 값을 처리하면 끝~!!

//POST 데이터를 삽입
ContentValues value = new ContentValues();
value.put("DATA1", data1);
value.put("DATA2", data2);

// 데이터 리턴값을 처리할 Handler
Handler receive_handler = new Handler(msg -> {
    if(msg.what == SEND_WEB_RETURN){
        String data = msg.getData().getString("WEB_RETURN");
        if(!data.equals("null")){
            try {
                Log.d("RecvData", data);
                JSONObject object = new JSONObject(data);  //JSON 파싱
                ... //그 이후 응답 데이터 처리 진행
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
    return true;
});

NetworkTask HTTP_REQ = new NetworkTask("URL 주소", value, receive_handler);
HTTP_REQ.execute();

 

복잡해 보이지만 RequestHttpConnection.java 와 NetworkTask.java 는 한번 만들어 두면 변경할 필요없이 계속 사용 가능하다.

 

그럼 오늘도 모두들 화이팅 하세요 ㅎㅎ 

반응형

+ Recent posts