Notice
Recent Posts
Recent Comments
Link
투케이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 [클래스 종료]
[참고 사이트]
반응형
'투케이2K 알고리즘' 카테고리의 다른 글
Comments