투케이2K

506. (Android/Java) [Observable] [GSON] okhttp 요청 후 response 응답 값 Model SerializedName 파싱 및 콜백 응답 확인 본문

Android

506. (Android/Java) [Observable] [GSON] okhttp 요청 후 response 응답 값 Model SerializedName 파싱 및 콜백 응답 확인

투케이2K 2023. 2. 27. 20:18

[개발 환경 설정]

개발 툴 : AndroidStudio

 

[소스 코드]

 

// -------------------------------------
// [로직 처리 실시]
// -------------------------------------
        try {

            // [샘플 API 호출 및 Schedulers 설정 및 구독 결과 확인]
            SampleApi.request()
                    .retry((retryCnt, e)->{ // [retry : onError 발생 시 재요청 시도 : 지정 횟수 동안 재호출]
                        Log.i("---","---");
                        Log.d("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> main() :: retry() : 재요청 수행]");
                        Log.i("","\n"+"[재요청 시도 : "+String.valueOf(retryCnt)+"]");
                        Log.d("//===========//","================================================");
                        Log.i("---","---");

                        return retryCnt < 3 ? true : false;
                    })
                    .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
                    .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
                    .subscribe(new Observer<M_Model>() { // TODO [MODEL : Observable.create 타입 지정]
                        @Override
                        public void onSubscribe(@NonNull Disposable d) {
                        }

                        @Override
                        public void onNext(@NonNull M_Model model) {
                            Log.i("---","---");
                            Log.w("//===========//","================================================");
                            Log.i("","\n"+"[A_Test >> main() :: onNext() : 데이터 확인]");
                            Log.i("","\n"+"[M_MODEL : "+String.valueOf(new Gson().toJson(model))+"]");
                            Log.i("","\n"+"[ID : "+String.valueOf(model.id)+"]");
                            Log.w("//===========//","================================================");
                            Log.i("---","---");
                        }

                        @Override
                        public void onError(@NonNull Throwable e) {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"[A_Test >> main() :: onError() : 에러 발생]");
                            Log.i("","\n"+"[error : "+String.valueOf(e.getMessage())+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");
                        }

                        @Override
                        public void onComplete() {
                            Log.i("---","---");
                            Log.w("//===========//","================================================");
                            Log.i("","\n"+"[A_Test >> main() :: onComplete() : 완료 상태]");
                            Log.w("//===========//","================================================");
                            Log.i("---","---");
                        }
                    });

        }
        catch (Exception e){
            e.printStackTrace();
        }











// -------------------------------------
// [http 수행 클래스]
// -------------------------------------
package com.example.javaproject;

import android.util.Log;

import com.google.gson.Gson;

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

import io.reactivex.rxjava3.core.Observable;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class SampleApi {

    // [request 메소드 생성]
    public static Observable<M_Model> request() {
        return Observable.create(subscriber -> {
            try {
                if (subscriber.isDisposed() == false){ // [연결된 구독자가 있는 경우]

                    //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/json; charset=utf-8;"); //TODO [헤더]
                    request.post(new FormBody.Builder().build()); // TODO [POST 쿼리스트링]
                    request.url(httpBuilder.build()); //TODO [httpBuilder 추가]


                    //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();

                            // --------------------------------------
                            // TODO [콜백 응답 반환 : MODEL 데이터 매핑]
                            // --------------------------------------
                            subscriber.onNext(new Gson().fromJson(responseData, M_Model.class));
                            subscriber.onComplete();
                            // --------------------------------------
                        }
                        //TODO [실패한 경우]
                        @Override
                        public void onFailure(Call call, IOException e) {
                            final String responseCode = String.valueOf(e.toString());
                            final String responseData = String.valueOf(e.getMessage());

                            // [콜백 응답 반환]
                            subscriber.onError(e);
                            subscriber.onComplete();
                        }
                    });

                }
            }
            catch (Exception e){
                e.printStackTrace();

                // [onError] 에러 알림 전달
                subscriber.onError(e);
            }
        });
    }
    
} // TODO [클래스 종료]










// -------------------------------------
// [Model 정의 클래스]
// -------------------------------------
package com.example.javaproject;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class M_Model {


    /**
     * // --------------------------------------------------------------------------------------
     * TODO [클래스 설명]
     * // --------------------------------------------------------------------------------------
     * 1. GSON 모델 클래스
     * // --------------------------------------------------------------------------------------
     * 2. @SerializedName : JSON 객체 생성 시 표시될 key name
     * // --------------------------------------------------------------------------------------
     * 3. @Expose : 데이터가 null 일 경우 json 생성 시 제외 설정
     * // --------------------------------------------------------------------------------------
     * 4. build.gradle 설정 :
     *
     * implementation 'com.google.code.gson:gson:2.8.6'
     * // --------------------------------------------------------------------------------------
     * */





    /**
     * // --------------------------------------------------------------------------------------
     * // TODO [빠른 로직 찾기 : 주석 로직 찾기]
     * // --------------------------------------------------------------------------------------
     * // [SEARCH FAST] :
     * // --------------------------------------------------------------------------------------
     * */





    // -----------------------------------------------------------------------------------------
    // TODO [전역 변수 선언]
    // -----------------------------------------------------------------------------------------
    private static final String ACTIVITY_NAME = "M_Model";





    // -----------------------------------------------------------------------------------------
    // TODO [클래스 생성자 초기화]
    // -----------------------------------------------------------------------------------------
    public M_Model(String id){
        this.id = id;
    }





    // -----------------------------------------------------------------------------------------
    // TODO [JSON KEY DATA]
    // -----------------------------------------------------------------------------------------

    // [JSON KEY]
    @SerializedName("id") @Expose
    public String id;
    
    
} // TODO [클래스 종료]

 


 

반응형
Comments