프로그래밍/Android

[안드로이드] Retrofit으로 API 통신하기

Lou Park 2017. 3. 30. 02:25

이번 강의에서는 안드로이드를 위한 HTTP 클라이언트 레트로핏을 이용해서 API 통신을 구현 해 보도록 하겠다.

먼저, JSON 값을 돌려주는 서버가 준비 되어 있어야한다.

여기서는 간단히...깃헙 contributors를 통해 살펴보겠다.

주소는 https://api.github.com/repos/square/retrofit/contributors 이다.


목표

https://api.github.com/repos/square/retrofit/contributors 에 들어가면 아래와 같이 JSON 형식으로 된 정보들이 나온다.





오늘 해볼 것은 저 정보들 중에서 특히 'login' 정보를 TextView에 받아 오는 것이다.


build.graddle (app)


1
2
3
4
5
dependencies {
    ...
    compile 'com.squareup.retrofit2:retrofit:2.2.0'
    ...
}
cs


retrofit을 앱에 적용시키기 위해서 디펜던시 설정을 해준다.

위의 3번째 라인에 있는 한 줄을 추가시켜 주면된다.

그리고 컨버터로는 GSON을 사용할 것이기 때문에 아래의 한줄을 더 추가시켜준다.

(GSON이외에도 많은 컨버터들을 사용할 수 있다. >> 공식문서 참고)

compile 'com.squareup.retrofit2:converter-gson:2.2.0'


activity_retrofit.xml


1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <TextView
        android:text="TextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />
</LinearLayout>
cs


res > layout에 activity_retrofit.xml 파일을 추가시켜 준다.

이 텍스트뷰에 카테고리 정보를 띄울 것이다.


RetrofitActivity.java


1
2
3
4
5
6
7
public class RetrofitActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retrofit);
    }
}
cs


위와 같이 RetrofitActivity.java도 구현해준다.

이제 본격적으로 Retrofit을 이용 해 보도록 하겠다.


Contributor.class


1
2
3
4
5
6
7
8
public class Contributor {
    // login 정보를 받아올 것이므로
    public final String login;
 
    public Contributor(String login) {
        this.login = login;
    }
}
cs


login 필드에 해당하는 정보를 받아올 객체인 Contributor를 만든다.


GitHub.interface


1
2
3
4
5
6
7
8
9
public interface GitHub {
    // GET/POST/DELETE/PUT 메소드들을 인터페이스에 구현하여 사용할 수 있다.
    @GET("/repos/{owner}/{repo}/contributors")
    // JSON Array를 리턴하므로 List<>가 되었다
    Call<List<Contributor>> contributors(
            // param 값으로 들어가는 것들이다
            @Path("owner"String owner,
            @Path("repo"String repo);
}
cs


GItHub이라는 인터페이스에는 메소드들을 정의할 수 있다.

RESTful한 모든 것들이 다 들어갈 수 있으며 쿼리도 넣을 수 있다. 아래는 그 하나의 예시다.


@GET("/users/list?sort=desc")

RetrofitActivity.class


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class RetrofitActivity extends Activity {
    private Retrofit retrofit;
    private TextView textView;
 
    private final String BASE_URL = "https://api.github.com";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retrofit);
        init();
 
        // GitHub API 인터페이스 생성
        GitHub gitHub = retrofit.create(GitHub.class);
        // 인터페이스에 구현한 메소드인 contributors에 param 값을 넘기는 요청 만ㄷ름
        Call<List<Contributor>> call = gitHub.contributors("square""retrofit");
 
        // 앞서만든 요청을 수행
        call.enqueue(new Callback<List<Contributor>>() {
            @Override
            // 성공시
            public void onResponse(Call<List<Contributor>> call, Response<List<Contributor>> response) {
                List<Contributor> contributors = response.body();
                // 받아온 리스트를 순회하면서
                for (Contributor contributor : contributors) {
                    // 텍스트 뷰에 login 정보를 붙임
                    textView.append(contributor.login);
                }
            }
 
            @Override
            // 실패시
            public void onFailure(Call<List<Contributor>> call, Throwable t) {
                Toast.makeText(RetrofitActivity.this"정보받아오기 실패", Toast.LENGTH_LONG)
                        .show();
            }
        });
 
    }
 
    public void init() {
        textView = (TextView) findViewById(R.id.textView);
        // GSON 컨버터를 사용하는 REST 어댑터 생성
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
}
cs


다시 액티비티로 돌아와서, 위와 같이 입력해준다.


이제 앱을 실행하면 빠르게 결과가 뜨는 것을 알 수 있다. ^-^