투케이2K

45. (TWOK/ALGORITHM) [Android] 패턴 - 비동기 http 요청 수행 및 콜백 (callback) 결과 확인 본문

투케이2K 알고리즘

45. (TWOK/ALGORITHM) [Android] 패턴 - 비동기 http 요청 수행 및 콜백 (callback) 결과 확인

투케이2K 2022. 8. 6. 21:27

[환경 설정 및 설명]

언 어 : Android (Java)

설 명 : 패턴 - 비동기 http 요청 수행 및 콜백 (callback) 결과 확인

 

[소스 코드]

 

package com.example.testapp;

import android.content.Context;
import android.util.Log;

import org.json.JSONObject;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class C_CallbackHttpRequest {


    /**
     * // -----------------------------------------
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. http 통신 수행 및 콜백 리턴 클래스
     * // -----------------------------------------
     * 2. okhttp 사용해 구현 실시
     * // -----------------------------------------
     * 3. 필요 build.gradle 설정 :
     *   build.gradle(Project) : allprojects > repositories > mavenCentral() 추가
     *
     *   build.gradle(Module) :
     *   implementation("com.squareup.okhttp3:okhttp:4.9.0")
     * // -----------------------------------------
     * 4. 필요 퍼미션 설정 :
     *   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     *   <uses-permission android:name="android.permission.INTERNET"/>
     * // -----------------------------------------
     * */





    /**
     * // -----------------------------------------
     * TODO [사용 방법]
     * // -----------------------------------------
     *         C_CallbackHttpRequest c_callbackHttpRequest = new C_CallbackHttpRequest(new C_CallbackHttpRequest.ResultListener() {
     *             @Override
     *             public void onSuccess(String result) {
     *                 Log.i("---","---");
     *                 Log.w("//===========//","================================================");
     *                 Log.i("","\n"+"[A_Main >> onCreate() :: HTTP GET SUCCESS 콜백 확인 실시]");
     *                 Log.i("","\n"+"[result :: "+String.valueOf(result)+"]");
     *                 Log.w("//===========//","================================================");
     *                 Log.i("---","---");
     *             }
     *
     *             @Override
     *             public void onFail(String result) {
     *                 Log.i("---","---");
     *                 Log.e("//===========//","================================================");
     *                 Log.i("","\n"+"[A_Main >> onCreate() :: HTTP GET FAIL 콜백 확인 실시]");
     *                 Log.i("","\n"+"[result :: "+String.valueOf(result)+"]");
     *                 Log.e("//===========//","================================================");
     *                 Log.i("---","---");
     *             }
     *         });
     *         // [HTTP 요청 수행 실시]
     *         c_callbackHttpRequest.requestGet();
     * // -----------------------------------------
     * */





    // TODO [내부 인터페이스 정의 실시]
    public interface ResultListener {
        void onSuccess(String result); // [성공]
        void onFail(String result); // [실패]
    }




    // TODO [전역 변수 선언]
    private final ResultListener listener;
    private static Context mContext;
    private static final String CLASS_NAME = "C_CallbackHttpRequest";





    // TODO [클래스 생성자 초기화]
    public C_CallbackHttpRequest(ResultListener listener) {
        Log.i("---","---");
        Log.d("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(CLASS_NAME)+" >> 클래스 생성자 초기화 실시]");
        Log.d("//===========//","================================================");
        Log.i("---","---");

        // [전역 변수 리스너 지정 실시]
        this.listener = listener;
    }





    // TODO [http 요청 수행 메소드 정의 실시]
    public void requestGet(){
        try {
            //TODO [전송 url 정의 실시]
            String url = "https://jsonplaceholder.typicode.com/posts";

            //TODO [파라미터값 선언 실시]
            Map params = new HashMap();
            params.put("userId",1);
            params.put("id",1);

            //TODO [url에 파라미터 추가 실시]
            HttpUrl.Builder httpBuilder = HttpUrl.get(url).newBuilder();
            Set set = params.keySet();
            Iterator iterator = set.iterator();
            while(iterator.hasNext()){
                String key = (String) iterator.next();
                httpBuilder.addQueryParameter(key, String.valueOf(params.get(key))); //TODO [쿼리 파람 추가]
            }

            //TODO [OK HTTP 객체 선언 실시]
            OkHttpClient client = new OkHttpClient();
            Request.Builder request = new Request.Builder();
            request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8;"); //TODO [헤더]
            request.url(httpBuilder.build()); //TODO [httpBuilder 추가]

            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(CLASS_NAME)+" >> requestGet() :: HTTP GET 요청 실시]");
            Log.i("","\n"+"["+"요청 주소 : " + String.valueOf(url)+"]");
            Log.i("","\n"+"["+"전송 값 : " + String.valueOf(params.toString())+"]");
            Log.i("","\n"+"["+"전송 형태 : " + String.valueOf(httpBuilder.build())+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");

            //TODO [비동기 처리 (enqueue 사용)]
            client.newCall(request.build()).enqueue(new Callback() {
                //TODO [성공한 경우]
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    final String responseCode = String.valueOf(response.toString()); // [응답 코드]
                    final String responseData = response.body().string(); // [응답 데이터]
                    Log.i("---","---");
                    Log.d("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(CLASS_NAME)+" >> requestGet() :: HTTP GET 요청 성공]");
                    Log.i("","\n"+"["+"응답 코드 : " + String.valueOf(responseCode)+"]");
                    Log.i("","\n"+"["+"응답 값 : " + String.valueOf(responseData)+"]");
                    Log.d("//===========//","================================================");
                    Log.i("---","---");

                    // [콜백 리턴 실시]
                    try {
                        JSONObject resultJson = new JSONObject();
                        resultJson.put("SUCCESS", true);
                        resultJson.put("RESPONSE", responseData);

                        if (listener != null){
                            listener.onSuccess(String.valueOf(resultJson));
                        }
                    }
                    catch (Exception error){
                        error.printStackTrace();
                    }
                }
                //TODO [실패한 경우]
                @Override
                public void onFailure(Call call, IOException e) {
                    final String responseCode = String.valueOf(e.toString()); // [에러 코드]
                    final String responseData = String.valueOf(e.getMessage()); // [에러 메시지]
                    Log.i("---","---");
                    Log.d("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(CLASS_NAME)+" >> requestGet() :: HTTP GET 요청 실패]");
                    Log.i("","\n"+"["+"에러 코드 : " + String.valueOf(responseCode)+"]");
                    Log.i("","\n"+"["+"에러 내용 : " + String.valueOf(responseData)+"]");
                    Log.d("//===========//","================================================");
                    Log.i("---","---");

                    // [콜백 리턴 실시]
                    try {
                        JSONObject resultJson = new JSONObject();
                        resultJson.put("SUCCESS", false);
                        resultJson.put("RESPONSE", responseData);

                        if (listener != null){
                            listener.onFail(String.valueOf(resultJson));
                        }
                    }
                    catch (Exception error){
                        error.printStackTrace();
                    }
                }
            });
        }
        catch (Exception e){
            // e.printStackTrace();
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(CLASS_NAME)+" >> requestGet() :: HTTP GET 요청 실패]");
            Log.i("","\n"+"["+"CATCH : " + String.valueOf(e.getMessage())+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");

            // [콜백 리턴 실시]
            try {
                JSONObject resultJson = new JSONObject();
                resultJson.put("SUCCESS", false);
                resultJson.put("RESPONSE", String.valueOf(e.getMessage()));

                if (listener != null){
                    listener.onFail(String.valueOf(resultJson));
                }
            }
            catch (Exception error){
                error.printStackTrace();
            }
        }
    }


} // TODO [클래스 종료]

 


[참고 사이트]

https://kkh0977.tistory.com/2287

 

311. (AndroidStudio/android/java) http 통신 수행 및 콜백 (callback) 리턴 결과 확인 실시 - okhttp lib

[개발 환경 설정] ​ 개발 툴 : AndroidStudio 개발 언어 : java [소스 코드] ​ package com.example.testapp; import android.content.Context; import android.util.Log; import org.json.JSONObject; import..

kkh0977.tistory.com

 


 

반응형
Comments