개발/안드로이드

Android - https 통신을 위한 Retrofit 라이브러리

웅'jk 2023. 2. 9. 14:57

Retrofit 라이브러리 설치

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")

 

 

앱에 인터넷 권한 설정

// network_security_config 작성
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">*.amazonaws.com</domain>
    </domain-config>
</network-security-config>

// manifest 에 추가
<uses-permission android:name="android.permission.INTERNET"/>

// manifest application 에 networksecurityconfig 추가
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"

 

Config 작성

public class Config {

    public static final String DOMAIN = "서버주소";
    public static final String DOMAIN_TEST = "http://localhost:5000";
	
    public static final String PREFERENCE_NAME = "memo_app";
    public static final String ACCESS_TOKEN = "access_token";

}

 

api 패키지를 생성하고 Retrofit client 코드 작성

public class NetworkClient {
    public static Retrofit retrofit;
    public static Retrofit getRetrofitClient(Context context){
        if(retrofit == null){
            // 통신 로그 확인할때 필요한 코드
            HttpLoggingInterceptor loggingInterceptor =
                    new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            // 네트워크 연결관련 코드
            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.DOMAIN)
                    .client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

}

 

Api 설계서를 바탕으로 내가 보낼 데이터와 받을 데이터를 클래스로 지정한다.

// 내가 보낼 user class 
public class User implements Serializable {
    private String email;
    private String password;
    private String nickname;

    public User(){

    }

    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;
    }
}
// 내가 요청하여 받아올 userres 클래스
public class UserRes 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;
    }

 

API 인터페이스 작성

public interface UserApi {

    // 회원가입 API 함수 작성
    @POST("/user/register")
    Call<UserRes> register(@Body User user);

}

 

 

 

서버로 데이터 보내는 방법

// 1. 레트로핏 변수 생성
Retrofit retrofit = NetworkClient.getRetrofitClient("실행할 Activity");

// 2. Api 인터페이스 생성
UserApi api = retrofit.create(UserApi.class);

// 3. 서버에 보낼 데이터 객체 생성
User user = new User(email, password, nickname);

// 4. api 호출
Call<UserRes> call = api.register(user);
call.enqueue(new Callback<UserRes>() {
                    @Override
                    public void onResponse(Call<UserRes> call, Response<UserRes> response) {
                    
                        // 서버에서 보낸 응답이 200 OK 일때 처리하는 코드
                        if(response.isSuccessful()){
                            
                            // 서버가 보낸 데이터를 아까 만든 형식에 맞는 클래스에 저장.
                            UserRes res = response.body();

                        }else{
                            
                        }
                    }

                    @Override
                    public void onFailure(Call<UserRes> call, Throwable t) {
                        
                    }
                });