Android

[Android] Retrofit2 설정, API호출

eyoo 2022. 7. 21. 15:45

Retrofit2 매뉴얼:

https://square.github.io/retrofit/

 

Retrofit

A type-safe HTTP client for Android and Java

square.github.io

 

gradle 설정

 

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")

 

 

메인에서 쉐어드 프리퍼런스에 억세스 토큰이 있는지 확인

없으면 회원가입 엑티비티로

회원가입을 하면 저장소에 억세스토큰 저장

회원가입 종료하면 메인으로 돌아가고 

다시 로그인해서 메모앱 실행 

 

구조는 아래와 같음

 

user클래스

 

public class User implements Serializable {

    private String email;
    private String password;
    private String nickname;

    public User(String email, String password, String nickname) {

        this.email = email;
        this.password = password;
        this.nickname = nickname;

    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

 

RegisterRes 클래스

 

public class RegisterRes implements Serializable {

    private String result;
    private String access_token;

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public String getAccess_token() {
        return access_token;
    }

    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }
}

 

Config 클래스

 

public class Config {

    public static final String BASE_URL = "https://~~~.amazonaws.com";
    public static final String TEST_URL = "http://127.0.0.1.5000";
    public static final String PREFERENCE_NAME = "memo_app";

}

 

 

★ NetworkClient 클래스 (Retrofit 설정)

 

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(Config.BASE_URL)
                    .client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

        }
        return retrofit;
    }

}

 

★ RegisterActivity

 

public class RegisterActivity extends AppCompatActivity {

    EditText editEmail;
    EditText editPassword;
    EditText editNickname;
    Button btnRegister;

    // 네트워크 처리 보여주는 프로그레스 다이얼로그
    ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        editEmail = findViewById(R.id.editEmail);
        editPassword = findViewById(R.id.editPassword);
        editNickname = findViewById(R.id.editNickname);
        btnRegister = findViewById(R.id.btnRegister);

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

                // 이메일 가져온다 이메일 형식체크
                String email = editEmail.getText().toString().trim();
                Pattern pattern = android.util.Patterns.EMAIL_ADDRESS;

                if (pattern.matcher(email).matches()==false){
                    Toast.makeText(RegisterActivity.this, "이메일 형식이 올바르지 않습니다.", Toast.LENGTH_SHORT).show();
                    return;
                }

                // 비밀번호 가져온다
                String password = editPassword.getText().toString().trim();
                // 길이체크
                if(password.length()<4 || password.length()>12 ){
                    Toast.makeText(RegisterActivity.this, "비밀번호는 4자 이상 12자 이하로 입력해주세요.", Toast.LENGTH_SHORT).show();
                }

                // 닉네임 가져온다.
                String nickname = editNickname.getText().toString().trim();
                // 있는지 체크
                if(nickname.isEmpty()){
                    Toast.makeText(RegisterActivity.this, "닉네임을 입력하세요.", Toast.LENGTH_SHORT).show();
                    return;
                }

                // 이 데이터를 API로 호출
                // 네트워크를 통해서 데이터를 보내고있다는 프로그레스 다이얼로그를 먼저 띄운다.
                showProgress(getString(R.string.dialog_Registering));

                Retrofit retrofit = NetworkClient.getRetrofitClient(RegisterActivity.this);

                UserApi api = retrofit.create(UserApi.class);

                User user = new User(email, password, nickname);

                Call<RegisterRes> call = api.register(user);
                call.enqueue(new Callback<RegisterRes>() {
                    @Override
                    public void onResponse(Call<RegisterRes> call, Response<RegisterRes> response) {
                        // 성공했읗때
                        dismissProgress();

                        if (response.isSuccessful()){

                            RegisterRes registerRes = response.body();

                            // 억세스토큰은 이제 앱에서 API호출할때마다 헤더에 넣어서 보내야 한다. (인증)
                            // 따라서 억세스 토큰은 쉐어드 프리퍼런스(저장소)에 저장해 놓는다.
                            SharedPreferences sp = getApplication().getSharedPreferences(Config.PREFERENCE_NAME, MODE_PRIVATE);
                            SharedPreferences.Editor editor = sp.edit();
                            editor.putString("accessToken", registerRes.getAccess_token());
                            editor.apply();

                            finish();

                        } else if (response.code()==400){
                            Toast.makeText(RegisterActivity.this, "400번 에러발생 : "+response.code(), Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(RegisterActivity.this, "에러발생 : "+response.code(), Toast.LENGTH_SHORT).show();
                        }

                    }

                    @Override
                    public void onFailure(Call<RegisterRes> call, Throwable t) {
                        // 네트워크 자체문제로 실패했읗때
                        dismissProgress();

                    }
                });




            }
        });

    }


    // 다이얼로그 만드는 함수
    void showProgress(String message){
        dialog = new ProgressDialog(RegisterActivity.this);
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.setMessage(message);
        dialog.show();
    }

    void dismissProgress(){
        dialog.dismiss();
    }

}