기억 저장소

클라우드 기반 인공지능 개발과 DevOps 실무

프론트엔드/안드로이드 스튜디오

안드로이드 스튜디오 : 레트로핏 GET 데이터 받기

하늘.98 2022. 3. 25. 17:39

-안드로이드 스튜디오 서버에 값을 받아올 때 레트로핏을 사용한다   ->  retrofit 

 

아래 코드는 버튼 클릭 시 이벤트 발생으로 

받아온 토큰이 있는 지 확인 후 

토큰을 없애고 로그아웃을 하는 코드이다 여기서 봐야할 것은 

레트로 핏으로 서버와 연결 하는 것이다 . 

 

레트로핏 공식 문서 

https://velog.io/@duckchanahn/Android-Studio-Retrofit2-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0

 

Android Studio - Retrofit2 시작하기

Retrofit2

velog.io

 

 

버튼 클릭 시 이벤트 발생하며  레트로핏에 연결하는 코드 

informationbtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        SharedPreferences sp = getSharedPreferences(Utils.PREFERENCES_NAME, MODE_PRIVATE);
        accessToken = sp.getString("accessToken", "");
        if(accessToken.isEmpty()){
            // 로그인 액티비티를 띄운다.
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }else{

            showProgress("내 정보 가져오는 중 입니다....");

            Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);
            ImageApi api = retrofit.create(ImageApi.class);
            Call<UserInfoRes> call = api.UserInfo("Bearer "+ accessToken);

            Log.i("MyMemoApp", "2222");
            call.enqueue(new Callback<UserInfoRes>() {
                @Override
                public void onResponse(Call<UserInfoRes> call, Response<UserInfoRes> response) {
                    dismissProgress();
                    if(response.isSuccessful()){
                        // 200 OK 인 경우
                        // 정상 저장되었으면, 이 액티비티는 끝낸다.
                        User_email = response.body().getUser_email();
                        User_nickname =response.body().getUser_nickname();
                        Intent intent = new Intent(MainActivity.this, UserActivity.class);
                        intent.putExtra("User_email",User_email);
                        intent.putExtra("User_nickname",User_nickname);
                        startActivity(intent);
                        finish();
                    }else{
                        Toast.makeText(MainActivity.this,
                                "죄송합니다 현재 이용 불가 합니다 ㅠㅠ",
                                Toast.LENGTH_SHORT).show();
                        return;
                    }
                }

                @Override
                public void onFailure(Call<UserInfoRes> call, Throwable t) {
                    dismissProgress();
                    Toast.makeText(MainActivity.this,
                            "죄송합니다 현재 이용 불가 합니다 ㅠ",
                            Toast.LENGTH_SHORT).show();
                    return;

                }
            });
        }
    }
});

---------------------------------------------레트로핏 get 코드 (클래스)-------------------------------------------------

Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);
ImageApi api = retrofit.create(ImageApi.class);
Call<UserInfoRes> call = api.UserInfo("Bearer "+ accessToken);

Log.i("MyMemoApp", "2222");
call.enqueue(new Callback<UserInfoRes>() {
    @Override
    public void onResponse(Call<UserInfoRes> call, Response<UserInfoRes> response) {
        dismissProgress();
        if(response.isSuccessful()){
            // 200 OK 인 경우
            // 정상 저장되었으면, 이 액티비티는 끝낸다.
            User_email = response.body().getUser_email();
            User_nickname =response.body().getUser_nickname();
            Intent intent = new Intent(MainActivity.this, UserActivity.class);
            intent.putExtra("User_email",User_email);
            intent.putExtra("User_nickname",User_nickname);
            startActivity(intent);
            finish();
        }else{
            Toast.makeText(MainActivity.this,
                    "죄송합니다 현재 이용 불가 합니다 ㅠㅠ",
                    Toast.LENGTH_SHORT).show();
            return;
        }
    }

    @Override
    public void onFailure(Call<UserInfoRes> call, Throwable t) {
        dismissProgress();
        Toast.makeText(MainActivity.this,
                "죄송합니다 현재 이용 불가 합니다 ㅠ",
                Toast.LENGTH_SHORT).show();
        return;

    }
});

-------------------------------------------------UserAPI(인터페이스)----------------------------------------------------------

public interface UserApi {
    // 로그인 API
    @POST("/dev/api/v1/user/login")
    Call<UserRes> userLogin(@Body UserReq userReq);

    // 로그아웃 API
    @POST("/dev/api/v1/user/logout")
    Call<UserRes> userLogout(@Header("Authorization") String accessToken);

    // 회원가입 API
    @POST("/dev/api/v1/user/login")
    Call<UserRes> userSignUp(@Body UserReq userReq);

}

----------------------------------------------UserInfoReq(클래스) --------------------------------------------------

public class UserInfoReq {
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

-----------------------------------------------UserInfoRes(클래스)-----------------------------------------------------

 

이부분에서 getter/setter로 받아올 때 

return 값으로는 서버에서 보내는 

return 값과 같이 써야지 값이 똑바로 올 수 있다. 

이부분이 맞지 않으면 null 값 또는 오류가 발생할 확률이 높다. 

public class UserInfoRes {
    private String user_email;
    private String user_nickname;
    private String error;

    public String getUser_email() {
        return user_email;
    }

    public void setUser_email(String user_email) {
        this.user_email = user_email;
    }

    public String getUser_nickname() {
        return user_nickname;
    }

    public void setUser_nickname(String user_nickname) {
        this.user_nickname = user_nickname;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }
}

------------------------------------------------NetworkClient(클래스)---------------------------------------------------------

import android.content.Context;

import com.jhn.googlemaptest.utils.Utils;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class NetworkClient {
    public static Retrofit retrofit;

    public static Retrofit getRetrofitClient(Context context){
        if(retrofit == null){

            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
            OkHttpClient httpClient = new OkHttpClient.Builder()
                    .connectTimeout(1, TimeUnit.MINUTES)
                    .readTimeout(1, TimeUnit.MINUTES)
                    .writeTimeout(1, TimeUnit.MINUTES)
                    .addInterceptor(loggingInterceptor).build();
            retrofit = new Retrofit.Builder().baseUrl("Lamda 주소 ")
                    .client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}