Retrofit2


안드로이드를 개발하다보니 API 를 호출하는 경우가 있는데 편하게 사용할 수 있는 라이브러리를 소개합니다.

Square사에 Jake Wharton이라는 분이 참여한 오픈소스 프로젝트입니다.

간단한 개발을 하면서 레트로핏 관련 정보를 정리하고자 이 글을 작성하게 되었습니다.


출처 : http://square.github.io/retrofit/

https://news.realm.io/kr/news/droidcon-jake-wharton-simple-http-retrofit-2/




Retrofit의 장점

Retrofit이 인터페이스와 메서드, 그리고 어떻게 요청이 생성됐는지 서술적으로 정의하는 매개 변수 어노테이션을 사용한다는 점.

Apache HTTP client, URL 연결, OkHttp, 커스텀 client 등 어떤 HTTP client라도 원하는 대로 사용할 수 있다는 점.

시리얼라이제이션 역시 플러그형입니다. 기본으로는 GSON을 사용하지만, JSON을 사용하는 분이라면 Jackson으로 교체할 수도 있습니다.

...

등등 공식 페이지에 좋은 설명이 가득합니다.

제가 사용했을때 유용했던 기능들을 요약해서 소개합니다.




응답의 매개 변수화 

retrofit1에는 제공하지 못하던 응답 코드와 응답 메시지, 헤더 엑세스 등의 메타 데이터를 응답에서 제공받을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
class Response<T> {
  int code();
  String message();
  Headers headers();
 
  boolean isSuccess(); 
  T body();
  ResponseBody errorBody(); 
  com.squareup.okhttp.Response raw();
}
 
cs

성공적으로 요청되었는지 가늠하는 편의 메서드가 있는데 기본적으로 200 코드를 점검하기 위한 것입니다. 또한 바디와 에러 바디에 접근하기 위한 분리된 메서드를 제공합니다. 이들 메서드 사용은 boolean 리턴 타입과 일치합니다. 응답이 성공적이어야만 실제 디시리얼라이제이션하고 바디의 콜백에 넣습니다. 만약 성공 메서드가 false를 리턴한다면 응답의 타입이 무엇이었는지 알 수 없게 됩니다. 그런 상황에는 content 타입과 길이, raw body를 압축한 ‘ResponseBody’ 타입을 사용자에게 건네서 해석할 수 있게 합니다.


다이내믹 URL 매개 변수

1
2
3
4
5
6
7
8
9
10
11
interface GitHubService {
  @GET("/repos/{owner}/{repo}/contributors")
  Call<List<Contributor>> repoContributors(
      @Path("owner"String owner,
      @Path("repo"String repo);
 
  @GET
  Call<List<Contributor>> repoContributorsPaginate(
      @Url String url);
}
 
cs

URL 내부에서 전달할 수 있는 새로운 ‘@Url’ 어노테이션 기능에서는 Git optional에 있는 간접 경로를 만들었음을 볼 수 있습니다. 이 follow up 메서드를 사용해서 링크를 만들고 뒤따르는 call을 받기 위한 두 번째 paginate 메서드 역시 call할 수 있습니다.

1
2
3
4
5
6
String nextLink = nextFromGitHubLinks(links); 
 
// https://api.github.com/repositories/892275/contributors?page=2 
 
Call<List<Contributor>> nextCall = 
    gitHubService.repoContributorsPaginate(nextLink);
cs

이 코드는 2 페이지를 만들기 위한 요청을 하는 동시에 3 페이지를 만들 수 있게 하는 헤더를 포함합니다. 이 paginate 메서드를 사용해서 이런 작업을 계속 이어갈 수 있습니다. 특정 API들이 지원하는 이런 방법을 Retrofit 1에서는 지원하지 않았기 때문에 많은 사람이 불편해했었죠.

Retrofit Type 설정

1
2
3
4
5
6
7
8
9
10
11
12
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com")
    .build(); 
 
interface GitHubService {
  @GET("/repos/{owner}/{repo}/contributors")
  Call<List<Contributor>> repoContributors(
      @Path("owner"String owner,
      @Path("repo"String repo);
 
GitHubService gitHubService = retrofit.create(GitHubService.class);
cs

시작 부분에 /를 넣으면 이것이 호스트에서부터 시작하는 절대 경로가 됨을 의미합니다. 

1
2
3
4
5
6
interface GitHubService {
  @GET("repos/{owner}/{repo}/contributors")
  Call<List<Contributor>> repoContributors(
      @Path("owner"String owner,
      @Path("repo"String repo);
}
cs

/를 붙이지 않는다면 온전히 상대 경로가 되고 현재 경로에서 시작하는 경로에서부터 resolve 됩니다. 이 시작 URL을 지우면 v3 path를 포함한 온전한 URL을 얻을 수 있습니다.




이상으로 제가 이해하기 쉬웠던 레트로핏2의 특징을 정리해보았습니다.

추후에 수정이 필요한 내용은 추가하도록 하겠습니다.

공식 페이지에 들어가시면 더욱 많은 정보를 얻으실 수 있습니다!!


감사합니다.





+ Recent posts