본문 바로가기
Android

안드로이드 retrofit2(레트로핏2)를 이용한 통신예제 (1)

by 일용직 코딩노동자 2020. 12. 8.
728x90
반응형

저는 주로 데이터베이스의 정보를 긁어올때 사용하던 방법입니다.

 

우선 build.gradle (:app) 에다가 라이브러리를 추가해주겠습니다.

 

implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
    implementation 'com.googlecode.android-query:android-query:0.25.9'
    implementation 'com.squareup.okhttp3:okhttp:3.3.1'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    implementation 'com.squareup.retrofit2:retrofit:2.1.0'
    implementation('com.squareup.retrofit2:converter-simplexml:2.1.0') {
        exclude module: 'stax-api'
        exclude module: 'stax'
        exclude module: 'xpp3'
    }

레트로핏 외에 okhttp 및 제이슨을 사용하기위한 gson을 추가해줬습니다.

 

인터페이스를 하나 만들어보겠습니다.

마우스 우클릭을 통해 Java Class를 클릭하시면

 

이처럼 인터페이스를 생성이 가능합니다.

 

import com.google.gson.JsonObject;
import java.util.HashMap;
import retrofit2.Call;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface Http {
    /**
     * 아이디 찾기
     **/
    @FormUrlEncoded
    @POST("bioindustrial/Login/idfind.jsp")
    Call<JsonObject> research_email(@FieldMap HashMap<String, String> map);
 }

저는 Http라는 인터페이스를 생성하여 이처럼 경로를 작성하였습니다.

 

아이디 찾기를 데이터베이스에서 select문을 통하여 긁어올려고 한 예제입니다.

 

뒤에 더 보실게요.

 

import java.security.cert.CertificateException;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

public class HttpURL {

    public static final String API_BASE_URL = "http://192.168.0.101:8080/";

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    private static Retrofit.Builder baseBuilder = new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create());

    public static <S> S createBaseService(Class<S> serviceClass) {

        Retrofit retrofit = baseBuilder.client(httpClient.build()).build();
        return retrofit.create(serviceClass);

    }

 

이렇게 레트로핏을 클래스 하나를 생성하신 후에 셋팅해주시면 됩니다.

 

적는 HttpURL이라는 클래스를 만들어서

 

상단에 통신할 주소를 적어주었습니다.

 

그 이후에 레트로핏을 셋팅해주었습니다.

 

여기서 만약 통신하실 주소가 https인데 SSL인증서가 완료가 되어있지 않는 주소라면, 따로 셋팅을 하셔야하는데

 

밑에 부분은 https일경우 + SSL인증서가 없는 경우입니다.

private static OkHttpClient getUnsafeOkHttpClient() {
        try {
            final TrustManager[] trustAllCerts = new TrustManager[] {
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
public static Retrofit getRetrofit() {
        return new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(getUnsafeOkHttpClient())
                .build();
    }

밑에 이어서 함수를 작성해주세요. (https ssl인증서 에러를 회피하는 방법입니다)

 

그럼 여기서 약간의 수정이 들어갑니다.

 

제가 위에서 ✶안에 써놓은 코드를 수정할겁니다.

 

public static final String API_BASE_URL = "http://192.168.0.101:8080/";

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    public static <S> S createBaseService(Class<S> serviceClass) {
        Retrofit retrofit = getRetrofit();
        return retrofit.create(serviceClass);

    }

해당 코드를 이렇게 수정해주시면 됩니다.

 

다시 본론으로 돌아오겠습니다.

 

이제 본격적으로 레트로핏으로 통신할 셋팅은 끝났습니다.

 

자바 코드에서 사용해보도록 하겠습니다.

 

아이디찾기 및 기타 통신을 하실 버튼리스너에

 

private void connectToIdSearch(String name, String phone){
        HashMap<String, String> map = new HashMap<>();
        
        map.put("user_hp_no", phone);
        map.put("user_nm", name);
        
        Http service = HttpURL.createBaseService(Http.class);
        
        Call<JsonObject> call = service.research_email(map);
        call.enqueue(new Callback<JsonObject>() {
            @Override
            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
                if(response.isSuccessful()){

                    JsonObject jsonObject = response.body();
                    JsonArray jsonArray = jsonObject.getAsJsonArray("List");

                    if(jsonArray.size() > 0){

                        String result = jsonObject.get("result").getAsString();
                        if(result.equals("00")){ //디비에있는 정보와 내가 입력한 값이 일치했을때 조건
                            String e_mail = jsonArray.get(0).getAsJsonObject().get("user_id").getAsString();

                            AlertDialog.Builder alert_confirm = new AlertDialog.Builder(Finalvar.mContext);
                            alert_confirm.setMessage("회원님의 ID는 "+e_mail+" 입니다.");
                            alert_confirm.setPositiveButton("확인", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    Intent intent = new Intent(getApplicationContext(), login.class);
                                    startActivity(intent);
                                    finish();
                                }
                            });
                            AlertDialog alert = alert_confirm.create();
                            alert.setIcon(R.drawable.icon);
                            alert.setTitle("알 림");
                            alert.show();
                        }
                        else{
                            AlertDialog.Builder alert_confirm = new AlertDialog.Builder(Finalvar.mContext);
                            alert_confirm.setMessage("정보가 일치하지 않습니다.");
                            alert_confirm.setPositiveButton("확인", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                }
                            });
                            AlertDialog alert = alert_confirm.create();
                            alert.setIcon(R.drawable.icon);
                            alert.setTitle("알 림");
                            alert.show();
                        }
                    }
                    else{
                        AlertDialog.Builder alert_confirm = new AlertDialog.Builder(Finalvar.mContext);
                        alert_confirm.setMessage("정보가 일치하지 않습니다.");
                        alert_confirm.setPositiveButton("확인", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                            }
                        });
                        AlertDialog alert = alert_confirm.create();
                        alert.setIcon(R.drawable.icon);
                        alert.setTitle("알 림");
                        alert.show();
                    }
                }
            }

            @Override
            public void onFailure(Call<JsonObject> call, Throwable t) {
            	Log.d("Error : ",t);
            }
        });
    }

 

저 같은 경우에는 유저의 이름 및 핸드폰번호를 받아서 데이터베이스와 대조하여 아이디찾기 기능을 구현했습니다.

 

상황에따라 다이얼로그창을 띄워줬습니다.

 

우선 HashMap을 통해서 키,벨류 쌍으로 값을 셋팅해줍니다.

 

인터페이스 만드신것과 대조해서 보시면 조금 쉽습니다.

 

위에 보시는 createBaseService가 아까 HttpURL클래스에서 셋팅한 레트로핏입니다.

 

Call<JsonObject> call = service.research_email(map); 이부분을 보시면 research_email은 인터페이스에서 결정한

 

이름입니다.

 

위에서 작성한 인터페이스를 참조하시면 됩니다.

 

이제 밑으로는 제이슨을 파싱하는 과정입니다.

 

다음 글에서 이제 이클립스 코드 (데이터베이스에서 정보 긁어오기) 과정을 살펴볼게요.

 

onedaycodeing.tistory.com/119

 

728x90
반응형

댓글