[안드로이드] Retrofit 란
TypeSafe한 HttpClient 라이브러리 중 하나로, OkHttp에 의존하고 있다.
매니페스트에 인터넷 사용권한 추가
<uses-permission android:name="android.permission.INTERNET"/>
gradle에 의존성 추가
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
retrofit 설정
Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl("https://baseurl.com") // 요청할 base url을 넣는다
.addConverterFactory(GsonConverterFactory.create()) // 데이터를 자동으로 컨버팅하기위한 gsonfactory사용
.build();
RetrofitAPI mRetrofitAPI = mRetrofit.create(RetrofitAPI.class); //실제 api 메소드들이 선언된 인터페이스 객체 선언
retrofit 요청
Call<SearchResultItem> mCallSearchResultList = mRetrofitAPI.getSearchResultList(/* parameters */); //요청에 필요한 파라미터들을 넘겨줄 수 있다
mCallSearchResultList.enqueue(mRetrofitCallback);
요청을 보내고 난 후 호출되는 callback함수
private Callback<Object> mRetrofitCallback = new Callback<Object>() {
@Override
public void onResponse(Call<Object> call, Response<Object> response) {
Object results = (Object) response.body();
// 여기선 객체타입을 Object로 했지만, response json 데이터에 맞게 pojo class를 작성 후 해당 클래스에 맞게 변환 가능
// 요청 성공시 코드
}
@Override
public void onFailure(Call<SearchResultItem> call, Throwable t) {
//요청 실패시 코드
t.printStackTrace();
}
};
API interface 정의
@Header 어노테이션을 이용해 http 헤더에 key:value를 추가할 수 있다.
@Query 어노테이션을 이용해 요청 파라미터를 넣을 수 있다. 밑의 코드는 baseurl/local.json?query=text&display=display… 같은 형식이 된다.
POST, PUT 방식의 경우에는 @Query 대신 @field 를 사용한다.
public interface RetrofitAPI {
@GET("local.json") // BASE URL 뒤에 붙을 경로를 명시
Call<Object> getSearchResultList(
@Header("X-Naver-Client-Id") String client_id,
@Header("X-Naver-Client-Secret") String client_secret,
@Query("query") String text,
@Query("display") int display,
@Query("start") int start,
@Query("sort") String sort
);
}
pojo class 정의시 @SeriallizedName 이란?
Response 와 DTO간의 변수 맵핑을 위해 사용한다.
서버에서 전송되는 변수 명과 내가 정의한 pojo class의 필드 명이 다를 경우 @SeriallizedName(“변수 명”)으로 매핑이 가능하다.
일치하는 경우는 쓰지않아도 자동으로 매핑된다.
반드시 getter와 setter를 생성하도록 하자.