투케이2K

816. (Android/Java) [유틸 파일] HttpURLConnection : http 통신 post body json 방식 요청 및 응답 상태 확인 본문

Android

816. (Android/Java) [유틸 파일] HttpURLConnection : http 통신 post body json 방식 요청 및 응답 상태 확인

투케이2K 2024. 7. 21. 12:32

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

 

    // -----------------------------------------------------------------------------------------
    // TODO [SEARCH FAST] : [Async] : [POST] : [BODY JSON] : requestPostBodyJsonHttp
    // -----------------------------------------------------------------------------------------
    // TODO [호출 방법 소스 코드]
    // -----------------------------------------------------------------------------------------
    /*
    try {
        // [URL 주소 선언]
        String url = "https://jsonplaceholder.typicode.com/posts";

        // [파라미터 생성]
        Map <String, Object> params = new HashMap<>();
        params.put("userId", 1);
        params.put("id", 1);

        // [http 요청 수행]
        N_NormalHttp.requestPostBodyJsonHttp(A_Webview.this, "http 요청", url, null, params) // [http 요청]
                    .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
                    .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
                    .subscribe(new Observer<String>() { // [Observable.create 타입 지정]
                        @Override
                        public void onSubscribe(@NonNull Disposable d) {
                        }

                        @Override
                        public void onNext(@NonNull String value) {
                            S_Log._W_("Http :: onNext :: 결과 확인", new String[]{String.valueOf(value)});
                        }

                        @Override
                        public void onError(@NonNull Throwable e) {
                            S_Log._E_("Http :: onError :: 에러 확인", new String[]{String.valueOf(e.getMessage())});
                        }

                        @Override
                        public void onComplete() {
                        }
                    });
    }
    catch (Exception e){
        S_Log._printStackTrace_(null, S_FinalData.LOG_BUG_STATE, null, e);
    }
    // */
    // -----------------------------------------------------------------------------------------
    public static Observable<String> requestPostBodyJsonHttp(Context mContext, String tag, String url, Map header, Map params){

        // [로직 처리 실시]
        return Observable.create(subscriber -> {

            new Thread(){
                @Override
                public void run(){

                    // [변수 선언]
                    HttpURLConnection httpConn = null;
                    BufferedReader bufferedReader = null;
                    PrintWriter pw = null;

                    try {

                        // ------------------------------------------------------
                        // TODO [URL 변수 선언 실시]
                        // ------------------------------------------------------
                        String urlData = String.valueOf(url).trim();

                        if (urlData.startsWith("http") == false){
                            subscriber.onError(new Throwable("[ERROR] : : [requestPostBodyJsonHttp] : Url Http Not Start"));
                            return;
                        }
                        // ------------------------------------------------------



                        // ------------------------------------------------------
                        // TODO [HTTP 전송 타입 설정]
                        // ------------------------------------------------------
                        URL reqUrl = new URL(urlData);

                        httpConn = (HttpURLConnection) reqUrl.openConnection();

                        httpConn.setRequestMethod("POST");
                        httpConn.addRequestProperty("Content-Type", "application/json"); // TODO [헤더]
                        httpConn.addRequestProperty("Cache-Control", "no-cache"); // TODO [헤더]

                        // [로그 출력 헤더 삽입]
                        Map<String, String> requestHeader = new HashMap<>();
                        requestHeader.put("Content-Type", "application/json");
                        requestHeader.put("Cache-Control", "no-cache");

                        if (C_Util.mapNotNull(header) == true){
                            Set set = header.keySet();
                            Iterator iterator = set.iterator();
                            while(iterator.hasNext()){
                                String key = (String) iterator.next();

                                requestHeader.put(key, String.valueOf(header.get(key))); // [로그 출력 헤더]

                                httpConn.addRequestProperty(key, String.valueOf(header.get(key))); // TODO [헤더]
                            }
                        }

                        httpConn.setDoOutput(true); // [OutputStream 으로 POST 데이터를 넘겨주겠다는 옵션]
                        httpConn.setDoInput(true); // [InputStream 으로 서버로 부터 응답을 받겠다는 옵션]

                        httpConn.setConnectTimeout(TIME_OUT_SECOND * 1000); // [연결 타임 아웃 시간] : [30 * 1000]

                        httpConn.setReadTimeout(TIME_OUT_SECOND * 1000); // [Read 시간] : [30 * 1000]
                        // ------------------------------------------------------



                        // ------------------------------------------------------
                        // TODO [Body 에 파라미터 추가 실시]
                        // ------------------------------------------------------
                        String bodyData = "";
                        if (C_Util.mapNotNull(params) == true) { // [파라미터가 있는 경우]

                            bodyData = String.valueOf(C_Util.mapToJsonObject(params));

                            pw = new PrintWriter(new OutputStreamWriter(httpConn.getOutputStream(), "UTF-8"));
                            pw.write(bodyData);
                            pw.flush();

                        }
                        // ------------------------------------------------------



                        // ------------------------------------------------------
                        // TODO [요청 로그 출력 실시]
                        // ------------------------------------------------------
                        S_Log._F_(mContext, "requestPostBodyJsonHttp :: OK HTTP 비동기 POST [요청] 실시", new String[] {
                                "TAG :: " + String.valueOf(tag),
                                "TYPE :: " + "POST >> REQUEST",
                                "URL :: " + String.valueOf(urlData),
                                "HEADER :: " + String.valueOf(requestHeader),
                                "BODY :: " + String.valueOf(bodyData)
                        });
                        // ------------------------------------------------------



                        // ------------------------------------------------------
                        // TODO [HTTP 응답 상태 확인]
                        // ------------------------------------------------------
                        String line = "";
                        String responseData = "";

                        int responseCode = httpConn.getResponseCode();

                        if (responseCode >= 200 && responseCode < 400){
                            bufferedReader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));
                        }
                        else {
                            bufferedReader = new BufferedReader(new InputStreamReader(httpConn.getErrorStream(), "UTF-8"));
                        }

                        StringBuffer stringBuffer = new StringBuffer();
                        while ((line = bufferedReader.readLine()) != null){ // [응답 Body 데이터 읽기]
                            stringBuffer.append(line);
                        }

                        // [응답 헤더의 정보를 모두 출력]
                        Map<String, String> responseHeader = new HashMap<>();
                        for (Map.Entry<String, List<String>> header : httpConn.getHeaderFields().entrySet()) {
                            for (String value : header.getValue()) {
                                responseHeader.put(String.valueOf(header.getKey()), String.valueOf(value));
                            }
                        }

                        // [Response 응답 값 삽입]
                        responseData = String.valueOf(stringBuffer);
                        // ------------------------------------------------------



                        // ------------------------------------------------------
                        // TODO [응답 로그 출력 실시]
                        // ------------------------------------------------------
                        S_Log._F_(mContext, "requestPostBodyJsonHttp :: OK HTTP 비동기 POST [응답] 확인", new String[] {
                                "TAG :: " + String.valueOf(tag),
                                "TYPE :: " + "POST >> RESPONSE",
                                "URL :: " + String.valueOf(urlData),
                                "CODE :: " + String.valueOf(responseCode),
                                "HEADER :: " + String.valueOf(responseHeader),
                                "DATA :: " + String.valueOf(responseData)
                        });
                        // ------------------------------------------------------



                        // ------------------------------------------------------
                        // TODO [응답 값에 따라서 로직 분기 처리]
                        // ------------------------------------------------------
                        if (responseCode >= 200 && responseCode < 400){

                            // TODO [결과 전송 실시]
                            subscriber.onNext(String.valueOf(responseData));
                            subscriber.onComplete();
                        }
                        else {
                            subscriber.onError(new Throwable("[ERROR] : : [requestPostBodyJsonHttp] : " + C_ErrorCheck.getErrorHttpMsg(String.valueOf(responseCode))));
                        }
                        // ------------------------------------------------------

                    }
                    catch (Exception e) {
                        // ------------------------------------------------------
                        // [로그 출력]
                        // ------------------------------------------------------
                        S_Log._printStackTrace_(mContext, S_FinalData.LOG_BUG_STATE, new String[] {
                                "requestPostBodyJsonHttp :: OK HTTP 비동기 POST [EXCEPTION] 확인",
                                "TAG :: " + String.valueOf(tag),
                                "TYPE :: " + "POST >> EXCEPTION",
                                "EXCEPTION :: " + String.valueOf(e.getMessage())
                        }, e);
                        // ------------------------------------------------------


                        // ------------------------------------------------------
                        // TODO [리턴 데이터 반환]
                        // ------------------------------------------------------
                        try { subscriber.onError(new Throwable("[EXCEPTION] : [2] : [requestPostBodyJsonHttp] : " + String.valueOf(e.getMessage()))); } catch (Exception ex){ ex.printStackTrace(); }
                        // ------------------------------------------------------
                    }
                    finally {

                        // TODO [마지막 종료 처리]
                        try {
                            if (httpConn != null){
                                httpConn.disconnect();
                            }
                            if (bufferedReader != null){
                                bufferedReader.close();
                            }
                            if (pw != null){
                                pw.close();
                            }
                        }
                        catch (Exception es){
                            es.printStackTrace();
                        }
                    }
                }

            }.start();

        });
    }
 

[결과 출력]


반응형
Comments