retrofit2 설정하기

By | 2021년 11월 6일
Table of Contents

retrofit2 설정하기

간단히 retrofit2 를 이용해 API 서버에서 데이타를 가져올 수 있다.

비동기처리도 동시에 해주므로 편하게 코딩할 수 있다.

샘플 json 파일

서버에서 넘겨받는 샘플 json 데이타는 아래와 같다.

{
  "code": "000",
  "message": "OK",
  "data": [
    {
      "id": 2,
      "search_string": "김치찌개"
    },
    {
      "id": 3,
      "search_string": "부대김치찌개"
    },
    {
      "id": 1,
      "search_string": "김치"
    }
  ],
  "paging": {
    "pageNo": 0,
    "pageSize": 5,
    "resultCount": 3,
    "totalCount": 3,
    "totalPages": 1,
    "first": true,
    "last": true
  }
}

DTO 클래스 생성

public class AutoCompleteItem {

    int id;

    // 필드명이 일치하지 않으면 지정해 줄 수 있다.
    @SerializedName("search_string")
    String searchString;

    // Getter()
}
public class Paging {

    int pageNo;
    int pageSize;
    int resultCount;
    int totalCount;
    int totalPages;
    boolean first;
    boolean last;

    // Getter()
}
public class AutoCompleteResponse {

    String code;
    String message;
    List<AutoCompleteItem> data;
    Paging paging;

    // Getter()
}

Client 생성

디버깅이 필요한 경우, 코맨트 친 부분을 해제해서 로그를 확인할 수 있다.

public class MGApiClient {

    private static final String BASE_URL = "https://<API 서버 아이피>/";
    private static Retrofit retrofit;

    public static Retrofit getApiClient() {
//        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
//        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//        OkHttpClient client = new OkHttpClient.Builder()
//                .addInterceptor(new Interceptor() {
//                    @Override
//                    public okhttp3.Response intercept(Chain chain) throws
//                            IOException {
//                        Request request = chain.request().newBuilder()
//                                .addHeader("key", "value")
//                                .addHeader("HEADER","HEADER Value")
//                                .build();
//                        return chain.proceed(request);
//                    }
//
//
//                })
//                .addInterceptor(interceptor)
//                .build();

        if(retrofit == null){
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
//                    .client(client)                                         // Logging
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return  retrofit;
    }
}

인터페이스 생성

헤더와 파라미터를 지정해 줄 수 있다.

public interface MGApiInterface {

    @GET("v1/esautocomplete/")
    Call<AutoCompleteResponse> getAutoComplete(
            @Header("Authorization") String token,
            @Query("q") String query,
            @Query("s") int size,
            @Query("p") int page
    );
}

실행하기

        MGApiInterface apiInterface = MGApiClient.getApiClient().create(MGApiInterface.class);

        Call<AutoCompleteResponse> call = apiInterface.getAutoComplete(
                getString(R.string.mgapi_key),
                "ㄱ",
                5,
                0);
        call.enqueue(new Callback<AutoCompleteResponse>() {
            @Override
            public void onResponse(@NotNull Call<AutoCompleteResponse> call, @NotNull Response<AutoCompleteResponse> response) {

                assert response.body() != null;
                AutoCompleteResponse autoCompleteResponse = response.body();

                for (AutoCompleteItem item : autoCompleteResponse.getData()) {
                    Log.d("getKeyHash", item.getSearchString());
                }
            }

            @Override
            public void onFailure(@NotNull Call<AutoCompleteResponse> call, @NotNull Throwable t) {
                Log.e("getKeyHash", t.getMessage());
            }
        });

답글 남기기